使用 Python 自动裁剪图像
Automatically cropping an image using Python
我想使用 OpenCV
将一张图片自动裁剪成多张图片,输出图片的数量是可变的。我首先将白色背景替换为透明背景。
输入图像:
我使用此脚本将白色背景替换为透明背景:
from PIL import Image
img = Image.open('./images/SPORTS/546.png')
img = img.convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if item[0] == 253 and item[1] == 252 and item[2] == 252:
newData.append((255, 255, 255, 0))
else:
newData.append(item)
img.putdata(newData)
img.show()
img.save("split_image_example.png", "PNG")
所以在这个例子中我想要得到 4 个分离的图像。
您可以在 findContour() 上使用 BoundingRect()
参见 http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html
针对您的情况:
img=cv2.imread(path_to_your_image,0)
if img is None:
sys.exit("No input image") #good practice
#thresholding your image to keep all but the background (I took a version of your
#image with a white background, you may have to adapt the threshold
thresh=cv2.threshold(img, 250, 255, cv2.THRESH_BINARY_INV);
res=thresh[1]
#dilating the result to connect all small components in your image
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
for i in range(10):
res=cv2.dilate(res,kernel)
#Finding the contours
img2,contours,hierarchy=
cv2.findContours(res,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cpt=0
for contour in contours:
#finding the bounding rectangle of your contours
rect=cv2.boundingRect(contour)
#cropping the image to the value of the bounding rectangle
img2=img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
cv2.imwrite("path_you_want_to_save"+str(cpt)+".png", img2)
cpt=cpt+1;
这是一个快速代码,您可能需要更改:保存方法、轮廓计算参数、膨胀方法....
最重要的是,它适合您在此处提供的图像,但可能不适合您的物体距离较近或更大的情况"sparse"(如果扩张不能将它们合并在一起)
我想使用 OpenCV
将一张图片自动裁剪成多张图片,输出图片的数量是可变的。我首先将白色背景替换为透明背景。
输入图像:
我使用此脚本将白色背景替换为透明背景:
from PIL import Image
img = Image.open('./images/SPORTS/546.png')
img = img.convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if item[0] == 253 and item[1] == 252 and item[2] == 252:
newData.append((255, 255, 255, 0))
else:
newData.append(item)
img.putdata(newData)
img.show()
img.save("split_image_example.png", "PNG")
所以在这个例子中我想要得到 4 个分离的图像。
您可以在 findContour() 上使用 BoundingRect() 参见 http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html
针对您的情况:
img=cv2.imread(path_to_your_image,0)
if img is None:
sys.exit("No input image") #good practice
#thresholding your image to keep all but the background (I took a version of your
#image with a white background, you may have to adapt the threshold
thresh=cv2.threshold(img, 250, 255, cv2.THRESH_BINARY_INV);
res=thresh[1]
#dilating the result to connect all small components in your image
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
for i in range(10):
res=cv2.dilate(res,kernel)
#Finding the contours
img2,contours,hierarchy=
cv2.findContours(res,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cpt=0
for contour in contours:
#finding the bounding rectangle of your contours
rect=cv2.boundingRect(contour)
#cropping the image to the value of the bounding rectangle
img2=img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
cv2.imwrite("path_you_want_to_save"+str(cpt)+".png", img2)
cpt=cpt+1;
这是一个快速代码,您可能需要更改:保存方法、轮廓计算参数、膨胀方法.... 最重要的是,它适合您在此处提供的图像,但可能不适合您的物体距离较近或更大的情况"sparse"(如果扩张不能将它们合并在一起)