gpt4 book ai didi

go - 删除边框/裁剪图像的最佳方法

转载 作者:IT王子 更新时间:2023-10-29 01:26:58 25 4
gpt4 key购买 nike

我正在使用 Go package (绑定(bind)到 ImageMagick 的 MagickWand C API)到 ImageMagick,我在其中从图像中删除边框(裁剪)。可以在下面找到我使用修剪功能的方式。

现在的问题是模糊因素。例如,如果我将该值设置为 2000,图像(here 是来源)仍然有一些像这样的白色图像:

  • 模糊因子值 2000 --> result
  • 模糊因子值 10000 --> result

我创建了一个小的 html 来最好地说明问题。它包含两个图像:https://dl.dropboxusercontent.com/u/15684927/image-trim-problem.html

如您所见,源代码的右下角有一些像素导致了问题。如果我将系数设置为 10000,我担心我会在其他图片上丢失像素。如果我将其设置为 2000,则在这些图片中修剪不正确。

所以我的实际问题是:“裁剪”/“修整”图像的最佳方式是什么?

package main

import "gopkg.in/gographics/imagick.v1/imagick"

func main() {
imagick.Initialize()
defer imagick.Terminate()

inputFile := "tshirt-original.jpg"
outputFile := "trimmed.jpg"
mw := imagick.NewMagickWand()
// Schedule cleanup
defer mw.Destroy()

// read image
err := mw.ReadImage(inputFile)
if err != nil {
panic(err)
}

// first trim original image
// fuzz: by default target must match a particular pixel color exactly.
// However, in many cases two colors may differ by a small amount. The fuzz
// member of image defines how much tolerance is acceptable to consider two
// colors as the same. For example, set fuzz to 10 and the color red at
// intensities of 100 and 102 respectively are now interpreted as the same
// color for the purposes of the floodfill.
mw.TrimImage(10000)

// Set the compression quality to 95 (high quality = low compression)
err = mw.SetImageCompressionQuality(95)
if err != nil {
panic(err)
}

// save
err = mw.WriteImage(outputFile)
if err != nil {
panic(err)
}
}

最佳答案

基本上,您的问题是图像边缘存在高频、高振幅伪像。或者,换句话说,边缘处有一个尖锐的高峰值,如果你想使用修剪,它会迫使你使用如此高的模糊值来克服这个问题,以至于算法也将“实际内容”视为相等到“背景”(边框)。

这里的一个解决方案是使用多步骤方法,首先平滑边缘伪影,然后对生成的图像应用修剪。通过平滑它,你摆脱了高峰并将它涂抹成一个漂亮的连绵起伏的山丘。反过来,连绵起伏的丘陵可以用较低的模糊值轻松修剪。然后,这会为您提供所需的几何图形,您可以使用它来裁剪原件。

具体来说,让我们以原始图像为例: Original Image

现在,让我们通过 convert original.jpg -blur 10x10 10x10.jpg 使用半径为 10 和 sigma 为 10 的模糊来平滑边缘上的脊线,结果: 10x10 blurred image

现在,您可能会注意到边缘上的瑕疵现在几乎消失了。

我们现在可以进行“虚拟”修剪,并通过 convert 10x10.jpg -fuzz 2000 -format %@ info: 询问 ImageMagick 修剪的结果是什么,根据文档为您提供“修剪边界框(实际上没有修剪)”:1326x1560+357+578%

采用这些值(百分号除外)并将它们用于裁剪几何图形,为您提供使用裁剪命令进行转换 convert original.jpg -crop 1326x1560+357+578 cropped.jpg,它给你:

cropped image without noise

编辑:

现在,既然你想把它作为代码,使用 imagick ,这是代码中的解决方案。它假定您将文件存储为“./data/original.jpg”并将其存储为“./data/trimmed.jpg”

package main

import (
"fmt"

"gopkg.in/gographics/imagick.v2/imagick"
)

func init() {
imagick.Initialize()
}

const originalImageFilename = "data/original.jpg"

func main() {

mw := imagick.NewMagickWand()
err := mw.ReadImage(originalImageFilename)
if err != nil {
fmt.Sprint(err.Error())
return
}

// Use a clone to determine what will happen
mw2 := mw.Clone()

mw2.BlurImage(10, 10)
mw2.TrimImage(2000)

_, _, xOffset, yOffset, err := mw2.GetImagePage()
if err != nil {
fmt.Sprint(err.Error())
return
}

trimmedWidth := mw2.GetImageWidth()
trimmedHeight := mw2.GetImageHeight()

mw2.Destroy()

mw.CropImage(trimmedWidth, trimmedHeight, xOffset, yOffset)

mw.WriteImage("data/trimmed.jpg")
mw.Destroy()
}

关于go - 删除边框/裁剪图像的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36446678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com