使用open填充图像中的空白区域并去除突出区域

2024-09-28 17:06:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图填补一些空白区域和删除突出的地区,使图像更平滑。但它只在一定程度上起作用。最大的轮廓需要变得更平滑。 输入图像:

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


Tags: 图像importtruenppositionareacv2kernel
1条回答
网友
1楼 · 发布于 2024-09-28 17:06:53

您使用的是一个正方形内核,它将为您的形状提供正方形的角。使用一个圆形的将得到更平滑,圆角。另外,使用每边像素数为偶数的内核会导致形状发生轻微偏移。奇数更适合于内核大小。你知道吗

而且,使用的迭代次数越多,得到的平滑度就越高。如果您使用太多的迭代,它将开始删除重要的细节。所以,从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)

相关问题 更多 >