Rog*_*ers 2 imagemagick go imagick go-imagick
我正在使用Go包(Go绑定到ImageMagick的MagickWand C API)到ImageMagick,在这里我要从图像中删除边框(裁剪)。我使用修剪功能的方式可以在下面找到。
现在的问题是模糊因素。例如,如果我将该值设置为2000,则图像(这里是源)仍然具有一些白色图像,如下所示:
我创建了一个小的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)
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,您的问题是图像边缘处有高频,高振幅的伪像。或者,换句话说,在边缘处出现一个尖锐的高峰值,如果要使用修整,它会迫使您使用如此高的模糊值来克服此问题,从而算法也将“实际内容”视为相等到“背景”(边界)。
这里的一种解决方案是使用多步骤方法,其中您首先要平滑边缘伪像,然后对所得图像应用修剪。通过平滑处理,您可以摆脱高山峰,并将其涂抹到漂亮的起伏山丘中。反过来,起伏的山丘可以轻松地以低模糊值进行修剪。然后,这会为您提供所需的几何体,可用于裁剪原始几何体。
现在,让我们使用半径为10且sigma为10至的模糊模糊化边缘上的脊convert original.jpg -blur 10x10 10x10.jpg,这样会产生:

现在,您可能会注意到边缘上的伪像现在已经消失了。
现在,我们可以进行“虚拟”修剪,并询问ImageMagick修剪的结果是什么convert 10x10.jpg -fuzz 2000 -format %@ info:,根据文档,这将为您提供“ 修剪边界框(实际上没有修剪) ”:1326x1560+357+578%
取这些值(百分号除外)并将其用于作物几何图形,将为您提供带作物转换命令convert original.jpg -crop 1326x1560+357+578 cropped.jpg,该命令将为您提供:
编辑:
现在,由于您希望将此作为代码,因此使用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()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
927 次 |
| 最近记录: |