我正在尝试填充一些空白区域并去除突出的区域,以使图像更平滑。但这仅在一定程度上起作用。需要使最大轮廓更平滑。 输入图像:
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)
程序的输出
但是我正在尝试一些没有凹痕和突出部分的东西,如下所示。有办法吗?
答案 0 :(得分:0)
您使用的是方形内核,它将使您的形状具有方形角。使用圆形的圆角可以使圆角更平滑。同样,使用每边偶数个像素的内核会导致形状稍微偏移。奇数更适合内核大小。
此外,您使用的迭代次数越多,获得的平滑度就越高。如果使用太多的迭代,它将开始删除重要的细节。因此,从1次迭代开始,然后增加迭代次数直到您感到满意为止。
我使用7x7圆形内核,腐蚀5次迭代和膨胀5次迭代得到了这个结果:
代码:
Dd = cv2.imread('images/input.png', 0)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7))
Dd = cv2.erode(Dd,kernel,iterations = 5)
Dd = cv2.dilate(Dd,kernel,iterations = 5)
cv2.imwrite('images/output.png', Dd)