我试图填补一些空白区域和删除突出的地区,使图像更平滑。但它只在一定程度上起作用。最大的轮廓需要变得更平滑。 输入图像:
import os
import sys
import cv2
import numpy as np
Dd = cv2.imread('images/input.png', 0)
kernel = np.ones((6,6),np.uint8)
DdErode = 1;
DdDilate = 1;
Dd = cv2.erode(Dd,kernel,iterations = DdErode)
Dd = cv2.dilate(Dd,kernel,iterations = DdDilate)
im2, contours, hierarchy = cv2.findContours(Dd, cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
maxArea = 0;
position = 0;
maxPosition =0;
for cont in contours :
area = cv2.contourArea(cont);
if area > maxArea :
maxArea = area;
maxPosition = position;
position = position + 1;
# print (maxArea);
epsilon = 0.001*cv2.arcLength(contours[maxPosition],True)
epsilon = 0.001*cv2.arcLength(contours[maxPosition],True)
approx = cv2.approxPolyDP(contours[maxPosition],epsilon,True)
cv2.drawContours(Dd, [approx], -1, (255, 255, 0), -1)
cv2.imwrite('images/output.jpg', Dd)
程序的输出
但我试着找一些没有凹痕和突出部分的东西。有办法吗?你知道吗
您使用的是一个正方形内核,它将为您的形状提供正方形的角。使用一个圆形的将得到更平滑,圆角。另外,使用每边像素数为偶数的内核会导致形状发生轻微偏移。奇数更适合于内核大小。你知道吗
而且,使用的迭代次数越多,得到的平滑度就越高。如果您使用太多的迭代,它将开始删除重要的细节。所以,从1次迭代开始,增加迭代次数直到你满意为止。你知道吗
我用一个7x7的圆形内核得到了这个结果,5次腐蚀,然后5次膨胀:
代码:
相关问题 更多 >
编程相关推荐