opencv 在像素blob周围创建边框

798qvoo8  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个函数,它生成一个二进制掩码的一个单一的'blob',看起来像这样:

(Note:这个蒙版是通过寻找一系列点的凸船体来生成的。我的“边界寻找”功能可以访问用于生成凸船体的两个点)
我想把紧挨着白色像素的黑色像素的值设置为一个特定的值,从而创建一个“边框”。

我尝试用以下代码进行边缘检测:cv2.Canny(image, 50, 150, apertureSize=3),以及模糊原始遮罩以创建新遮罩,但都没有得到所需的结果。
我发现的唯一成功的方法是蛮力。

pos = np.where(image > 0)

for x, y in zip(pos[1], pos[0]):
    neighbours = [(y, x - min(x, 1)), (y, x + min(image.shape[1] - 1 - x, 1)), (y - min(y, 1), x), (y + min(image.shape[0] - 1 - y, 1), x)]
    for a, b in neighbours:
        if image[a, b] == 0:
            image[a, b] = 100

有没有一种方法可以使用Cv2来实现相同的结果?

kxeu7u2r

kxeu7u2r1#

下面的代码查找并绘制输入图像上值为255的像素的轮廓。

import cv2
import numpy as np

#Read input image 
input_image = cv2.imread("input.png",0)
#Copy for output image
output_image = cv2.imread("input.png")

#Check Unique values and image size
#print(np.unique(input_image)) #=> [0,255]
#print(input_image.shape) #=>(22, 22, 3)

#Found the values present in image is 0 and 255, filter out any values other than 255.
mask_filetred = cv2.inRange(input_image, 254, 255)
#Find the countour of pixels with value 255
contours, _ = cv2.findContours(mask_filetred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

#print(contours) #=> countour list

#Draw the contour on 'output_image' i.e. copy of input image.
cv2.drawContours(output_image, contours, -1, (0,0,255), 1)
# Save output image to 'output.png'
cv2.imwrite('output.png',output_image)

输入图像

输出图像

相关问题