python-opencv 实现不规则区域ROI的粘贴操作

本文介绍了一种使用Python的OpenCV库来处理非规则区域感兴趣(ROI)图像的方法。通过创建mask,对原图进行特定形状的绘制,然后进行位运算,最终在原图上实现反向mask部分的填充。详细步骤包括读取图片、绘制多边形、创建mask、进行位运算以及图像合成,适合于需要对非矩形ROI进行操作的场景。
摘要由CSDN通过智能技术生成

找了一圈网上类似的做法,很少有资料使用python CV2去操作的,基本上都是使用C++ opencv 的CopyTo函数

这里简单记录一下实现过程:

上图,这里是一张200 x 200 x 3的图(图一):

 我们现在有多个不规则点围成的图形 [50,50], [100,50], [100,20], [150,20], [150, 150], [100, 150], [100, 70], [50, 70]

大致勾勒出来的图像如图所示(图二):

 我们先对图一简单处理下得到它的mask图

img = cv2.imread(r'C:\Users\User\Desktop\1.jpg')
a = np.array([[[50,50], [100,50], [100,20], [150,20], [150, 150], [100, 150], [100, 70], [50, 70]]], dtype = np.int32)
x_data = []
y_data = []
for i1 in a:
    for i2 in i1:
        x_data.append(i2[0])
        y_data.append(i2[1])
pts = np.vstack((np.array(x_data), np.array(y_data))).astype(np.int32).T
w = 200
h = 200
mask = np.zeros((h, w), dtype=np.uint8)
cv2.fillPoly(mask, [pts], (255, 255, 255), 8, 0)
cv2.imwrite(r'C:\Users\User\Desktop\3_mask.jpg', mask)

 处理完写在本地的3_mask.jpg(图三)如下图所示:

 我们再简单实现以下要在ROI上做的绘图逻辑(我这里实现的是斜线填充,可以改成任意:比如改颜色加滤镜)

draw_img = img.copy()
for i in range(0, 200, 10):
    point1 = (i, 200)
    point2 = (200, i)
    cv2.line(draw_img, point1, point2, (0, 0, 255), 1)
    point1 = (0, i)
    point2 = (i, 0)
    cv2.line(draw_img, point1, point2, (0, 0, 255), 1)
cv2.imwrite(r'C:\Users\User\Desktop\1111_res.jpg', draw_img)

此时,得到的1111_res.jpg(图四)如下图:

接着,对图四做mask图的与操作:

mask_res = cv2.bitwise_and(draw_img, draw_img, mask=mask)
cv2.imwrite(r'C:\Users\User\Desktop\4_res.jpg', mask_res)

 得到图五,如下所示:

最骚的操作来了,在原图(即图一)上,画出反向mask的部分且涂黑

img66 = cv2.imread(r'C:\Users\User\Desktop\1.jpg')
a = np.array([[[50,50], [100,50], [100,20], [150,20], [150, 150], [100, 150], [100, 70], [50, 70]]], dtype = np.int32)
cv2.polylines(img66, a, True, (255, 255, 255), 1)
cv2.fillPoly(img66, a, (0, 0, 0)) # 纯色填充
cv2.imwrite(r'C:\Users\User\Desktop\5_res.jpg', img66)

 得到图六:

最后:把图五图六做像素相加:

res = cv2.add(mask_res, img66)
cv2.imwrite(r'C:\Users\User\Desktop\6_res.jpg', res)

 上结果图(图七):

 是不是很神奇?这是针对非规则ROI的处理,矩形ROI的网上一堆,请自行百度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值