案例内容

编写程序,通过"+",add,加权和三种方法,探究可视化数字水印的嵌入过程
lena.bmp
              原始图像
watermark.bmp
              水印图像

案例原理

对于8位位图,在OpenCV中,使用"+"完成两个数的加法运算时,运算结果会取模处理,运算结果会除255取余。
比如 a处像素值为240,b处像素值为50,a + b的结果为(a + b) % 255 = 290 % 255 = 35

在使用cv2.add(a, b)完成加法运算时,得到的对象会采用饱和处理,大于255的运算结果会被处理为255。
比如 a处像素值为240,b处像素值为50,a + b的结果为min(255, a + b) = min(255, 290) = 255

在使用加权和处理数值时,会将两数值先乘以各自的权重值,进行相加后,再加上调节值,达成最终结果。
比如 a处像素值为120,权重值为0.3,b处像素值为50,权重值为0.6,调节值为10,则加权和的结果为120 × 0.3 + 50 × 0.6 + 10 = 76

重要代码

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)

输出图像dst表示,将两幅图像src1与src2在乘以对应的系数alpha,beta后,在加上亮度调节值gamma后的结果。

代码实现

在代码最开始,需要导入cv2库与numpy库,随后读取原始图像,获取原始图像的相关信息。即:

import cv2
lena=cv2.imread("lena.bmp",0)
Watermark=cv2.imread("watermark.bmp",0)

分别使用"+"、add、加权和对原始图像与水印图像进行加法运算,即:

add1=lena+Watermark                             #加法运算符“+”运算
add2=cv2.add(lena,Watermark)                    #add加法运算
add3=cv2.addWeighted(lena,0.6,Watermark,0.3,55) #加权和cv2.addWeighted

展示结果:

cv2.imshow("lena",lena)
cv2.imshow("watermark",Watermark)
cv2.imshow("add1",add1)
cv2.imshow("add2",add2)  
cv2.imshow("add3",add3)  
cv2.waitKey()
cv2.destroyAllWindows()

最终代码:

#===导入库,获取原始图像与水印图像===
import cv2
lena = cv2.imread("image\lena.bmp", 0)
Watermark = cv2.imread("watermark.bmp", 0)
#===进行加法运算===
add1 = lena + Watermark                                #加法运算符“+”运算
add2 = cv2.add(lena, Watermark)                        #add加法运算
add3 = cv2.addWeighted(lena, 0.6, Watermark, 0.2, 40)  #加权和cv2.addWeighted
#===显示结果===
cv2.imshow("lena", lena)
cv2.imshow("watermark", Watermark)
cv2.imshow("add1", add1)
cv2.imshow("add2", add2)
cv2.imshow("add3", add3)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果

运行结果

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐