The*_*ark 6 python opencv numpy image
我正在使用 OpenCV 在 Python 上进行一些图像处理。我正在尝试在轮廓由蒙版制成的图像上叠加轮廓。我正在使用cv2.Canny()获取蒙版的轮廓,然后使用cv2.cvtColor()将其更改为颜色,最后使用outline[np.where((outline == [255,255,255]).all(axis=2))] = [180,105,255]. 我现在的问题是这是一条 1 像素粗的线,在大图像上几乎看不到。本大纲的所有[0,0,0]除非我作为掩模运用我的彩色图像使用到分cv2.bitwise_or(img, outline。
我目前正在通过蛮力和检查位图中的每个像素来加厚此轮廓,以检查其相邻像素是否为 [180,105,255],如果是,该像素也会发生变化。这是非常缓慢的。有没有办法使用 numpy 或 openCV 自动执行此操作?我希望用 numpy 进行一些条件索引,但找不到任何东西。
根据情况有两种方法:
cv2.dilate() - 增强所有白色像素cv2.drawContours() - 增强特定像素例子
使用这个输入图像
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)
Run Code Online (Sandbox Code Playgroud)
方法#1
前景(白色)中的所有像素的面积将增加cv2.dilate()。我们创建一个结构元素并进行扩张。更多的迭代将产生更粗的线
iterations=1(左)、iterations=2(中)、iterations=3(右)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
dilate = cv2.dilate(mask, kernel, iterations=1)
Run Code Online (Sandbox Code Playgroud)
方法#2
当我们只想增强图像的特定部分而不影响其他部分时,我们可以使用cv2.drawContours(). 我们可以使用thickness参数指定颜色并调整大小。结果将类似于cv2.dilate()具有颜色选择的附加好处
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)
Run Code Online (Sandbox Code Playgroud)