加粗一个像素线

8
我正在使用OpenCV在Python上进行图像处理。我试图在图像上覆盖一个轮廓线,该轮廓线是从蒙版中生成的。我使用cv2.Canny()获取蒙版的轮廓线,然后使用cv2.cvtColor()将其更改为颜色,最后使用outline[np.where((outline == [255,255,255]).all(axis=2))] = [180,105,255]将该边缘转换为青色。我的问题是这是一条只有一个像素宽度的线,在大图片上几乎看不见。此轮廓线除了我使用cv2.bitwise_or(img, outline)作为蒙版应用到彩色图像上的点之外,全部为[0,0,0]

我目前正在通过暴力方式加粗这个轮廓线,并检查位图中的每个像素,以检查它的任何邻居是否为[180,105,255],如果是,该像素也会发生变化。这非常慢。有没有办法使用numpy或openCV自动完成这项工作?我希望可以使用一些条件索引来处理numpy,但找不到任何有用的东西。


2
{btsdaf} - Divakar
不,我不知道那个存在。我该如何使用它? - TheStrangeQuark
1
https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.ndimage.morphology.binary_dilation.html - Divakar
3
使用OpenCV进行膨胀操作:dilated = cv2.dilate(im, np.ones((3, 3)))。其中,im为原始图像,np.ones((3, 3))创建了一个大小为3x3的全1矩阵作为膨胀核。 - Miki
3个回答

9
以下是两种基于不同情况的方法:

例子

使用以下输入图像:

enter image description here

import cv2
import numpy as np

# Create test image
mask = np.zeros((200,200,3), dtype=np.uint8)
cv2.line(mask, (50, 100), (150, 100), (255,255,255), 1)

方法 #1

前景(白色)中的所有像素将使用cv2.dilate()增加其面积。我们创建一个结构元素并进行膨胀。更多迭代会生成更厚的线。

iterations=1(左),iterations=2(中),iterations=3(右)

enter image description here enter image description here enter image description here

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilate = cv2.dilate(mask, kernel, iterations=1)

第二种方法

当我们想要仅增强图像的特定部分而保留其他区域时,我们可以使用cv2.drawContours()。我们可以使用thickness参数指定颜色并调整大小。其结果与cv2.dilate()类似,但还可选择颜色。

enter image description here

gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
cnts = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(mask, [c], -1, (255,255,255), thickness=15)

1
我会看一下形态学操作。 膨胀听起来最接近你想要的。 如果您不想扩大图像的其余部分,则可能需要在线条的子区域上进行处理。

1
你需要执行一个膨胀操作。 膨胀是一种形态学操作,它会使输入图像中更亮的区域变大。如此处所述,膨胀是通过将输入图像与某个内核进行卷积来执行的:

当内核B在图像上扫描时,我们计算B覆盖的最大像素值,并用该最大值替换锚点位置处的图像像素。

锚点通常是内核的中心。
对于你的情况,我建议使用一个尺寸为你选择的椭圆形内核。 使用一像素厚的线和尺寸为(n,n)内核,你的膨胀图像中的线条将大约为2*n厚。

Here's a sample code :

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    result = cv2.dilate(outline, kernel)

这是一个膨胀的例子:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接