- A+
所属分类:大数据
1 原理
一幅图像即三维数组,多幅图像长宽完全一致时,便可以进行像素互相运算。
2 代码
- import cv2 as cv
- def add_demo(m1, m2): # 相加
- dst = cv.add(m1, m2)
- cv.imshow("add demo", dst)
- def subtract_demo(m1, m2): # 相减
- dst = cv.subtract(m1, m2)
- cv.imshow("subtract demo", dst)
- def divide_demo(m1, m2): # 相除
- dst = cv.divide(m1, m2)
- cv.imshow("divide demo", dst)
- def multiply_demo(m1, m2): # 相乘
- dst = cv.multiply(m1, m2)
- cv.imshow("multiply demo", dst)
- def others(m1, m2):
- M1, dev1 = cv.meanStdDev(m1)
- M2, dev2 = cv.meanStdDev(m2)
- print(M1)
- print(M2)
- print(dev1)
- print(dev2)
- print("start")
- src = cv.imread("C:/Users/Admin/Desktop/1.jpg") # 读取图像
- src2 = cv.imread("C:/Users/Admin/Desktop/2.jpg") # 读取图像
- print(src.shape)
- print(src2.shape)
- cv.imshow("input image1", src) # 显示图片到特定的窗口中
- cv.imshow("input image2", src2) # 显示图片到特定的窗口中
- add_demo(src2, src)
- subtract_demo(src2, src)
- divide_demo(src2, src)
- multiply_demo(src2, src)
- others(src2, src)
- cv.waitKey(0) # 等待用户操作,0为一直等待,5000为等待用户操作5s
- cv.destroyAllWindows() # 释放所有内存
3 讲解
- 从print("start")开始,读取两幅长宽一样的图像,并显示;
- add_demo函数负责将两幅图像的对应像素值相加,黑色部分像素值为0,超过255截取为255,所以结果图中形成了两幅图重叠的效果
- subtract_demo函数负责将两幅图像的对应像素值相减,黑色部分像素为0,减后不足0,截取数值为0,白色部分为255,减去后形成彩色的“OpenCV”字样
- divide_demo函数负责将两幅图像的对应像素值相除,除后结果数值非常小,所以效果图中基本为黑色
- multiply_demo函数负责将两幅图像的对应像素值相乘,黑色部分为0,乘后还是为0,白色部分乘后超过255,截取为255,结果图中毛边的原因是因为原“OpenCV”字样为了达到光滑的效果,做了抗锯齿处理,其实字符周围的像素并非为0,是很小的像素值,相乘后,数值扩大,形成毛边。
- others函数负责计算两幅图像的均值和方差,M1、M2为均值,dev1、dev2为方差,从结果中可以看出,字符图片均值小(因为以黑色为主),方差小(色彩单调);风景图均值大(色彩明亮),方差大(色彩丰富)。