图像的位操作的作用

转:图像的位操作的作用

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

è¿éåå¾çæè¿°

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

由于图像相加需要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)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值