Image 批量将不同大小的四元图像裁剪为圆形

Image 批量将不同大小的四元图像裁剪为圆形,image,opencv,command-line,imagemagick,crop,Image,Opencv,Command Line,Imagemagick,Crop,我有很多不同大小的行星图片,比如 它们均位于正方形图像的中部,但高度不同。 现在我想裁剪它们,使黑色边框透明。我试过使用convert(ImageMagick 6.9.10-23)如下: for i in planet_*.jpg; do nr=$(echo ${i/planet_/}|sed s/.jpg//g|xargs) convert $i -fuzz 1% -transparent black trans/planet_${nr}.png done 但这会留下一些瑕疵,如

我有很多不同大小的行星图片,比如

它们均位于正方形图像的中部,但高度不同。 现在我想裁剪它们,使黑色边框透明。我试过使用
convert
(ImageMagick 6.9.10-23)如下:

for i in planet_*.jpg; do
  nr=$(echo ${i/planet_/}|sed s/.jpg//g|xargs)
  convert $i -fuzz 1% -transparent black trans/planet_${nr}.png
done
但这会留下一些瑕疵,如:

是否有命令将所有图像裁剪成一个圆圈,使行星保持不变?(不能是imagemagick)

我还可以想象一个解决方案,我将使用一个更大的
-fuzz
值,然后用黑色填充内行星圈中的所有透明像素


这些都是行星,我想转换:

这里有一种方法可以使用minEclosingCircle中的Python Opencv

输入:


阈值图像:

输入时循环:

遮罩图像:

透明图像:

剪切的透明图像:

要安装的软件包
下面是使用minEclosingCircle中的Python Opencv的一种方法

输入:


阈值图像:

输入时循环:

遮罩图像:

透明图像:

剪切的透明图像:

要安装的软件包
值得一提的是,您使用的是哪个版本的Imagemagick,因为答案可能不同。请实际确定该版本。Imagemagick既没有Hough圆变换,也没有拟合圆。对于这些任务,您最好使用OpenCV。在ImageMagick中,我能看到的唯一方法就是反复画一个圆,遮住它,然后测试亮度。迭代以最大化亮度。值得一提的是,您使用的Imagemagick版本可能不同。请实际确定版本。Imagemagick既没有Hough圆变换,也没有适合圆的变换。对于这些任务,您最好使用OpenCV。在ImageMagick中,我能看到的唯一方法就是反复画一个圆,遮住它,然后测试亮度。迭代以最大化亮度。这看起来很完美,我将其保存为
planet2png.py
,并安装了
apt install python3 opencv python3 sklearn
,效果非常好;)我在这里添加了文件输入和输出处理:我在这个星球上只得到一个错误:-
crop planet_s1_299.jpg 2074-2 51回溯(最后一次调用):文件“planet2png.py”,第96行,在main(sys.argv[1:])文件“planet2png.py”,第83行,在main cv2.imwrite(“thresh/”+outputfile,thresh)cv2.error:OpenCV(4.2.0)../modules/imgcodecs/src/loadsave.cpp:661:错误:(-2:未指定的错误)在函数“imwrite”
中找不到指定扩展名的写入程序是否有办法平滑或反锯齿边框?错误在您的环境中,无法写入输出格式。该文件的格式是什么?从一张图像中获取圆圈参数。制作二进制掩码。然后将遮罩缩放到与每个输入图像相同的大小。然后使用适当修改的图像大小模糊参数对其进行反锯齿。较大的图像可能比较小的图像需要更多的模糊sigma,但不会太多。你可以用同样的模糊来对付。然后将遮罩放入图像的alpha通道。然后根据缩放的裁剪值进行裁剪。看起来很完美,我将其保存为
planet2png.py
,并安装了
apt install python3 opencv python3 sklearn
,效果非常好;)我在这里添加了文件输入和输出处理:我在这个星球上只得到一个错误:-
crop planet_s1_299.jpg 2074-2 51回溯(最后一次调用):文件“planet2png.py”,第96行,在main(sys.argv[1:])文件“planet2png.py”,第83行,在main cv2.imwrite(“thresh/”+outputfile,thresh)cv2.error:OpenCV(4.2.0)../modules/imgcodecs/src/loadsave.cpp:661:错误:(-2:未指定的错误)在函数“imwrite”
中找不到指定扩展名的写入程序是否有办法平滑或反锯齿边框?错误在您的环境中,无法写入输出格式。该文件的格式是什么?从一张图像中获取圆圈参数。制作二进制掩码。然后将遮罩缩放到与每个输入图像相同的大小。然后使用适当修改的图像大小模糊参数对其进行反锯齿。较大的图像可能比较小的图像需要更多的模糊sigma,但不会太多。你可以用同样的模糊来对付。然后将遮罩放入图像的alpha通道。然后根据缩放的裁剪值进行裁剪。
import cv2
import numpy as np
import skimage.exposure

# read image
img = cv2.imread('planet.jpg')
h, w, c = img.shape

# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]

# get contour
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
big_contour = max(contours, key=cv2.contourArea)

# get enclosing circle
center, radius = cv2.minEnclosingCircle(big_contour)
cx = int(round(center[0]))
cy = int(round(center[1]))
rr = int(round(radius))

# draw outline circle over input
circle = img.copy()
cv2.circle(circle, (cx,cy), rr, (0, 0, 255), 1)

# draw white filled circle on black background as mask
mask = np.full((h,w), 0, dtype=np.uint8)
cv2.circle(mask, (cx,cy), rr, 255, -1)

# antialias
blur = cv2.GaussianBlur(mask, (0,0), sigmaX=2, sigmaY=2, borderType = cv2.BORDER_DEFAULT)
mask = skimage.exposure.rescale_intensity(blur, in_range=(127,255), out_range=(0,255))


# put mask into alpha channel to make outside transparent
imgT = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
imgT[:,:,3] = mask

# crop the image
ulx = int(cx-rr+0.5)
uly = int(cy-rr+0.5)
brx = int(cx+rr+0.5)
bry = int(cy+rr+0.5)
print(ulx,brx,uly,bry)
crop = imgT[uly:bry+1, ulx:brx+1]

# write result to disk
cv2.imwrite("planet_thresh.jpg", thresh)
cv2.imwrite("planet_circle.jpg", circle)
cv2.imwrite("planet_mask.jpg", mask)
cv2.imwrite("planet_transparent.png", imgT)
cv2.imwrite("planet_crop.png", crop)

# display it
cv2.imshow("thresh", thresh)
cv2.imshow("circle", circle)
cv2.imshow("mask", mask)
cv2.waitKey(0)
sudo apt install python3-opencv python3-sklearn python3-skimage