我正在为图像比较工作,需要为此制作模板。
当前图片:
我能够为所需的图像着色,但无法裁剪所需的图像,为图像着色的代码如下:
import numpy as np
import cv2
img = cv2.imread('./org.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,1)
contours,h = cv2.findContours(thresh,1,2)
for cnt in contours:
approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
print (len(approx))
if len(approx)==5:
# print "pentagon"
cv2.drawContours(img,[cnt],0,255,-1)
elif len(approx)==3:
# print "triangle"
cv2.drawContours(img,[cnt],0,(0,255,0),-1)
elif len(approx)==4:
# print "square"
cv2.drawContours(img,[cnt],0,(0,0,255),-1)
elif len(approx) == 9:
# print "half-circle"
cv2.drawContours(img,[cnt],0,(255,255,0),-1)
elif len(approx) > 15:
# print "circle"
cv2.drawContours(img,[cnt],0,(0,255,255),-1)
cv2.imwrite('./test/Image_crop.jpg', img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
使用 python 帮助我寻求解决方案。
答案 0 :(得分:1)
您可以从轮廓创建一个mask
,并使用此蒙版从原始图像进行复制,然后可以保存图像。
cv::Mat dst;
originalIamge.copyTo(dst, mask);
cv::imwite("path/where/to/save.jpg", dst);
更新:详细信息。
从计数器cv::boundingRect(contour)
创建边界框
cv::Rect rect = cv::boundingRect(contour);
现在您可以使用此矩形从原始图像中获取子垫
cv::Mat roi = img(rect);
然后创建一个与Mat
相同大小的新ROI
cv::Mat dst = cv::Mat::create(roi.size(), CV_8UC3);
并创建一个蒙版
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
cv::drawContours(mask, contours, 0, cv::Scalar(255), cv::FILLED);
mask = mask(roi);
现在您可以使用遮罩复制图像的所需部分
roi .copyTo(dst, mask);
然后保存
cv::imwite("path/where/to/save.jpg", dst);