使用opencv

时间:2018-10-01 12:10:15

标签: python opencv

我正在尝试填充一些空白区域并去除突出的区域,以使图像更平滑。但这仅在一定程度上起作用。需要使最大轮廓更平滑。     输入图像:

Input image

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)

程序的输出

Output

但是我正在尝试一些没有凹痕和突出部分的东西,如下所示。有办法吗?

Desired

1 个答案:

答案 0 :(得分:0)

您使用的是方形内核,它将使您的形状具有方形角。使用圆形的圆角可以使圆角更平滑。同样,使用每边偶数个像素的内核会导致形状稍微偏移。奇数更适合内核大小。

此外,您使用的迭代次数越多,获得的平滑度就越高。如果使用太多的迭代,它将开始删除重要的细节。因此,从1次迭代开始,然后增加迭代次数直到您感到满意为止。

我使用7x7圆形内核,腐蚀5次迭代和膨胀5次迭代得到了这个结果:

enter image description here

代码:

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)