Python图像识别-Opencv04 区域选择、掩模算法

发布于:2022-11-02 ⋅ 阅读:(830) ⋅ 点赞:(0)

在图像处理过程中,我们可能对图像的某个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI)。在设定ROI后,可以对该区域进行整体操作

如图所示,如果我们想取下图中黑色区域块,我们可以表示为代码

img[25:50,25:50]

我们可以将黑色快复制到另一块区域

a = img[25:50,25:50]
img[25:50,-50:-25] = a

 于是我们得到了这样一张图

同时我们也可以截取人像脸部的位置:

face = img[22:158,95:170]

 得到图像

掩模

掩模在图像处理中被广泛应用,可以完成如下功能:

1、ROI的提取:使用掩模与原始图像进行计算,可以提取掩模指定的特定区域,将其余区域设置为白色或者黑色。

 2、屏蔽作用:仅让掩模指定的区域参与运算。

3、结构特征提取:用图像匹配方法检测和提取图像中与掩模相似的结构特征。

像这样一张图的生成,让我们看一下它的代码 

cv2.imshow('img',img)

h,w,c = img.shape

mask = np.zeros((h,w,c),dtype=np.uint8)
mask[22:300,43:95] = 1
mask[22:158,95:170] = 1
cv2.imshow('mask',mask*255)


masked_img = img*mask
cv2.imshow('masked_img',masked_img)

cv2.waitKey()
cv2.destroyAllWindows()

首先我们通过np.zeros函数创造出一个和原图同尺寸的全黑图层,然后取出相应透明区域,将0改为1

之后再通过掩模与原图相乘,则黑色部分为0*任何数,结果为0。而透明区域为1*任何数,结果为1,也就是原始像素点。因而得出MaskedFace

 逻辑运算

根据按位与运算的规则,任意数值与数值1进行与运算,结果都等于其自身的值。因此,任意一个8位像素值与二进制数1111 1111进行按位与运算,得到的都是像素值自身。二进制数111 111对应的十进制数是255,所以任意一个8位像素值与255进行按位与运算得到的都是原来的像素值,例如,如果像素点A的值为58,像素点B的值为135,将这两个像素值与255进行按位与运算后,得到的是它们自身的值

说明 像素点A 像素点B
像素点对应的二进制数 0011 1010 1000 0111
255的二进制形式 1111 1111 1111 1111
按位与运算的结果 0011 1010 1000 0111
十进制数 58 135
是否相等 相等 相等

当然,如果与0 (黑色) 进行按位与运算,则结果都是0 (黑色)

代码如下:

import numpy as np
import cv2

img = cv2.imread('D:/PixC/01.jpeg')

h,w,c = img.shape

mask = np.zeros((h,w,c),dtype=np.uint8)
mask[22:300,43:95] = 255
mask[22:158,95:170] = 255
masked_img = cv2.bitwise_and(img,mask)

cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('masked_img',masked_img)

cv2.waitKey()
cv2.destroyAllWindows()

得到如下图

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到