您当前的位置:首页 > 计算机 > 精彩资源

图像“位操作”有什么用?

时间:01-29来源:作者:点击数:

我们在看优酷视频时,经常会发现视频右上角上有“优酷”的字样。例如:

这里写图片描述

实际上我们可以把视频看作一幅幅的图像,在每幅图像中,我们把“优酷”这个图标加上去。于是一个很自然的想法就是图像相加。

由于图像相加需要2幅图像有相同的大小,因为图像就是矩阵,同维度的矩阵才能相加。于是先生成一副有“优酷”字样的黑色背景的图像,让其与每幅图像进行相加。

这里写图片描述
import cv2
car = cv2.imread("car.jpg")
youku = cv2.imread("youku.jpg")
car_and_youku = cv2.add(car, youku)
cv2.imshow("car_and_youku", car_and_youku)
cv2.waitKey()

得到相加图像如下:

这里写图片描述

我们注意到,“优酷”文字不再是纯红色,而是有了一定的混色。这是因为图像相加的话,是将相同位置的像素值直接相加,由于原图像上该文字所在的位置已经有像素值了,于是相加在一起就不是红颜色了。

那么,一个想法是能不能将原图像中优酷文字所在的地方抠出来,将其像素值赋为0,然后再相加呢?

当然是可以的!首先我们当然要知道“优酷”文字所在的位置。我们可以用前面提到的《颜色选择》方法,也可以使用阈值方法:

youku = cv2.imread("youku.jpg")
# 转换成灰度图,因为阈值操作只针对单通道图像
youku_gray = cv2.cvtColor(youku, cv2.COLOR_BGR2GRAY)
# 阈值操作,灰度值大于50的像素点位置赋值为255
ret, mask = cv2.threshold(youku_gray, 50, 255, cv2.THRESH_BINARY)
# 位操作:逻辑非。将黑白反向
mask_inv = cv2.bitwise_not(mask)
cv2.imshow("mask_inv", mask_inv)
cv2.waitKey()
这里写图片描述

我们注意上面的代码倒数第3行:

mask_inv = cv2.bitwise_not(mask)

这就是一种位操作,“bitwise_not”表示是一种逻辑非操作,即原来是0,变成255,原来是255,变成0。本质是一种反转操作,即黑色变成白色,白色变成黑色。如果像素某颜色通道值是100,则变成255-100=155。所以,如果是彩色的3通道图像,bitwise_not会分别对每个通道进行反色处理。

然后将原始图片中的“优酷”文字位置的地方抠出来:

car_bg = cv2.bitwise_and(car, car, mask=mask_inv)
cv2.imshow("car_bg", car_bg)
这里写图片描述

这里的bitwise_and是图像位操作中的逻辑和操作,即按照像素值的二进制进行相应位置的逻辑和操作。bitwise_and一般与掩膜(mask)共同操作。利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除。

为了确保提取的文字区域是一致的。将优酷文字原始图像也与文字位置掩膜进行操作,最后将2幅图像加起来:

youku_logo = cv2.bitwise_and(youku, youku, mask=mask)
final = cv2.add(car_bg, youku_logo)
cv2.imshow("final", final)

就得到了文章最前面的带“优酷”水印的图像。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门