OpenCV 图像的矩阵表示

目录

1、图片的矩阵表示

2、图片相加

3、图片颜色通道的分离与合并

4、图像像素的逻辑操作


1、图片的矩阵表示

        在计算机中,每一张图像都由行列排出的像素点组成,每个像素点只有一种颜色。对于任何一种颜色,在不同的颜色模式中可以使用一个或者一组数据表示。图像既然可以看作是像素点的集合,可以使用矩阵以对其进行表示。和直观感受不同,矩阵的表示是先行后列,也就是说如果想通过矩阵下标索引选择图片上某确定位置的像素点,需要输入的下标索引为(Y,X)。

        不同颜色模式下,表示同一图片的图像矩阵大小也不相同,对于一张长为W像素,宽为H像素的图片来说,如果以位图模式表示,需要W*H大小的01矩阵;灰度图模式下,需要W*H大小的uint8数据矩阵;RGB发光彩色模式下,由于需要RGB三色通道表示,则需要W*H*3大小的uint8数据矩阵。

        当一张图片被采集时,返回的图像对象就是一个矩阵。可以使用矩阵的下标索引对于图像进行分割提取处理。

# img1 时从 img 中索引 从 y 行到 y + h 行,从 x 列到 x + w 列得到的图像
img1 = img[y:y + h,x:x + w]

2、图片相加

        两张形状相同的图片可以相加,相当于矩阵的加法。相加后的图片会出现两幅图片的特征。

​# 图像1
img1 = cv2.imread("OpenCV.jpg")
img1 = cv2.resize(img1,(W, H))
# 图像2
img2 = cv2.imread("Python.jpg")
img2 = cv2.resize(img2,(W, H))
# 加和图像
img3 = cv2.add(img1,img2)
# 图像显示
cv2.imshow("OpenCV.jpg",img1)
cv2.moveWindow("OpenCV.jpg",0,0)
cv2.imshow("Python.jpg",img2)
cv2.moveWindow("Python.jpg",W,0)
cv2.imshow("add",img3)
cv2.moveWindow("add",2*W,0)

        OpenCV 提供了加权相加的函数接口,可以通过cv2.addWeighted设定两张图片的权值控制最终加和的图片样式。

​# 权值加和图像
img3 = cv2.addWeighted(img1,a,img2,b,0.2)
# dst = cv2.addWeighted(src1, alpha, src2, beta, gamma,dst,dtype)
# src1:加和图像1,矩阵 alpha:权值1,双精度
# src2:加和图像2,矩阵 beta:权值2,双精度
# gamma:加和亮度,给负值消减亮度,正值增加亮度,双精度
# dst:输出图像,矩阵

3、图片颜色通道的分离与合并

        当图片以BGR(RGB)等格式表示时,图片有多个颜色通道,可以使用cv2.split函数进行通道分离。当然,也可以直接对图片矩阵进行切片操作拿取通道数据。在OpenCV中,图片img的BGR通道分别为img[:,:,0],img[:,:,1],img[:,:,2]。当拿取通道值之后,若直接显示该通道值,则会以灰度图显示,较亮的部分代表此处对应通道颜色分量大。如下图中b窗口中蓝色部分最亮,g窗口中绿色部分最亮。

​# 图像1
img1 = cv2.imread("OpenCV.jpg")
img1 = cv2.resize(img1,(W, H))
b,g,r = cv2.split(img1)

# 图像显示
cv2.imshow("OpenCV.jpg",img1)
cv2.moveWindow("OpenCV.jpg",0,0)
cv2.imshow("b",b)
cv2.moveWindow("b",W,0)
cv2.imshow("g",g)
cv2.moveWindow("g",2*W,0)
cv2.imshow("r",r)
cv2.moveWindow("r",3*W,0)

        也可以将不同通道的数据通过cv2.merge进行合并。由于更改了通道合并的顺序,将b与r进行了互换,所以merge图像与原图不一样。merge图像中,红色的强度是原图中蓝色的值,蓝色的强度是原图中红色的值。当然,也可以通过矩阵合并直接合并通道。

img3 = cv2.merge([r,g,b])
cv2.imshow("merge",img3)

4、图像像素的逻辑操作

        图像的按位逻辑操作其实就是对应矩阵数据的按位逻辑操作,可以用一张图片来做图像掩码与需要处理的图像进行逻辑操作,达到图像处理的目的。

​return_img = cv2.bitwise_and(img1,img2)
"""
return_img = cv2.bitwise_and(img1,img2)
return_img:返回处理之后的图像矩阵
img1,img2:需要操作的同维度矩阵return_
"""

操作函数

操作功能

cv2.bitwise_and(img1,img2)

img1 与 img2 按位与操作

cv2.bitwise_or(img1,img2)

img1 与 img2 按位或操作

cv2.bitwise_not(img)

img 按位非操作

cv2.bitwise_xor(img1,img2)

img1 与 img2 按位异或操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗和远方曾来过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值