Python-Opencv中图像像素运算

Python-Opencv中图像像素运算

图像其实由每一个像素(每一个像素又由R G B三个通道的数据组合)堆积成的三维数组据,
所以两图象对应像素对应通道可以进行图像像素的运算,但是两个图像要同shape(高,宽,通道数)

import cv2 as cv

两个图形像素加运算

# 定义两个图形像素加运算函数
def add_demo(m1, m2):
	dst = cv.add(m1, m2)
	cv.imshow("add_demo", dst)

# 读入windows的Logo
src1 = cv.imread("WindowsLogo.jpg")
# 读入Linux的Logo
src2 = cv.imread("LinuxLogo.jpg") 
# 显示windows的Logo
cv.imshow("WindowsLogo", src1)
# 显示Linux的Logo
cv.imshow("LinuxLogo", src2)
# 进入两图象的像素加函数
add_demo(src1, src2)
# cv.waitKey(0) 则表示程序会无限制的等待用户的按键事件,说明就卡这在了这一帧
cv.waitKey(0)
# 关闭所有窗口
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第1张图片
该函数则是将两个大小相同的图像对应像素对应通道的值进行相加,不难看出,Linux只有黑色和白色组成,黑色区域则是每个像素的三个通道 RGB 值都为0,即 Linux[B, G , R] = 0,白色区域则是每个像素的三个通道 RGB 值都为255,即 Linux[B, G , R] = 255,所以当windows于Linux黑色部分相加时,每个像素的三个通道值相当于 Linux[B, G , R] + Windows[B, G, R] = Windows[B, G, R],所以在Linux黑色部分全为Windows的颜色。而在当windows于Linux白色部分相加时,每个像素的三个通道值相当于 Linux[B, G , R] + Windows[B, G, R] = Linux[B, G , R](由于相加的值都大于255,而默认的BGE值为 uint8,最大为255,故发生了溢出,最后都为255 ),所以在Linux白色部分全为Linux白色。从而实现了 Windows 和 Linux 的完美结合(现实中是结合不了的,哈哈哈)

两个图像的减运算

import cv2 as cv

# 读入windows的Logo
src1 = cv.imread("WindowsLogo.jpg")
# 读入Linux的Logo
src2 = cv.imread("LinuxLogo.jpg") 
# 显示windows的Logo
cv.imshow("WindowsLogo", src1)
# 显示Linux的Logo
cv.imshow("LinuxLogo", src2)
# 用 cv.subtract() 进行减运算 
dst = cv.subtract(sr2, sr1)
cv.imshow("Windows - Linux", dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第2张图片
与两图象进行相加类似 当Linux黑色减去对应Windows部分时,虽然为负数,但是仍然为0,Linux白的减去对应Windows部分时,会减出对应值。最后结果如图。

两个图像的乘运算

import cv2 as cv

# 读入windows的Logo
src1 = cv.imread("WindowsLogo.jpg")
# 读入Linux的Logo
src2 = cv.imread("LinuxLogo.jpg") 
# 显示windows的Logo
cv.imshow("WindowsLogo", src1)
# 显示Linux的Logo
cv.imshow("LinuxLogo", src2)
# 用 cv.multiply() 进行乘运算 
dst = cv.multiply(sr2, sr1)
cv.imshow("Windows * Linux", dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第3张图片
至于得到的结果会出现模糊原因在于Linux中白色边缘会有锯齿,故在乘起来边缘会模糊。

两个图像的除运算

import cv2 as cv

# 读入windows的Logo
src1 = cv.imread("WindowsLogo.jpg")
# 读入Linux的Logo
src2 = cv.imread("LinuxLogo.jpg") 
# 显示windows的Logo
cv.imshow("WindowsLogo", src1)
# 显示Linux的Logo
cv.imshow("LinuxLogo", src2)
# 用 cv.multiply() 进行除运算 
dst = cv.multiply(sr1, sr2)
cv.imshow("Windows / Linux",dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第4张图片

此外还可以对一个图像的像素去均值和标准差等运算

import cv2 as cv

src1 = cv.imread("WindowsLogo.jpg")
src2 = cv.imread("LinuxLogo.jpg")
# cv.meanStdDev()可以对每个通道的值去均值和方差
M1, dev1 = cv.meanStdDev(src1)
M2, dev2 = cv.meanStdDev(src2)
# M1为三个通道所有像素的均值
print(M1)
# dev1为三个通道所有像素的标准差
print(dev1)
print(M2)
print(dev2)
cv.waitKey(0)
打印结果
[[128.05269531]
 [109.60858073]
 [ 62.55748698]]
[[54.60093646]
 [45.52335089]
 [50.01800277]]
[[15.0128125]
 [15.0128125]
 [15.0128125]]
[[58.14062149]
 [58.14062149]
 [58.14062149]]

图像像素位运算

像素“与”运算

import cv2 as cv

# 读入windows的Logo
src1 = cv.imread("WindowsLogo.jpg")
# 读入Linux的Logo
src2 = cv.imread("LinuxLogo.jpg") 
# 显示windows的Logo
cv.imshow("WindowsLogo", src1)
# 显示Linux的Logo
cv.imshow("LinuxLogo", src2)
# 用 cv.bitwise_and 进行各像素各通道的与运算
dst = cv.bitwise_and(sr1, sr2)
cv.imshow("Windows and Linux", dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第5张图片
当对图像进行与运算时,实质是对两个图像各像素各通道值(用二进制存储,例如图一某像素的R通道值为 9,则存储时存为00001001,如果图二该像素R通道值为133,则存储时存为10000101)进行去与,00001001 and 10000101 = 10001101→141。

像素“或”运算

dst = cv.bitwise_or(src2,src1)
cv.imshw("Win or Lin", dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第6张图片
像素的或运算,也是在对应像素对应通道中二进制数值的或运算,所以Window 与 Linux 黑色区域“或”时,Linux的黑色区域每个通道值都为00000000,故与Windows对应部分或的结果就是Windows部分。而Linux白色区域各通道值都为11111111,故与Windows对应部分或的结果就是11111111,即Linux的白色部分。

像素“非”运算

dst = cv.bitwise_not(src2)
cv.imshow("not Lin", dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第7张图片
像素“非”运算则是对各像素各通道的二进制值取反,例如在Linux中的黑色部分,RGB各通道值都为00000000,取反后为11111111即变为白色。相反白色部分则会变成黑色。

像素“异或”运算

dst = cv.bitwise_xor(src1, src2)
cv.imshow("not Lin", dst)
cv.waitKey(0)
cv.destroyAllWindows()

Python-Opencv中图像像素运算_第8张图片
“异或”运算则是相同取0,相反取1,例如1 xor 1 = 0, 0 xor 0 = 1, 1 xor 0 =1。

初学Opencv,如有错误地方会改进地方,真诚地邀请您提出来,谢谢!
本文结束…

你可能感兴趣的:(Python-Opencv中图像像素运算)