1、opencv读取的图像是一个二维数组,如果是灰度图像,那么每个元素代表灰度值,如果是RGB图像,每个元素又是一个列表,分别存储BGR的值。
2、得到的image,有几个常用属性
3、把RGB图像分成三个单独的通道,用下面的表达式。
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
4、把离散的R、G、B图像合成一个RGB图像,用到merge方法。
具体看代码。
import cv2
import numpy as np
def getImageInfo():
path = "e:/images/1.JPEG"
img = cv2.imread(path)
# 获取横坐标和纵坐标为100的像素值,因为是彩色格式读取的,所以是BGR三个参数
print(img[100, 100])
# 获取横坐标和纵坐标为100的像素值的0通道,也就是B通道的值
print(img[100, 100, 0])
# shape属性是一个元组(width,height,channels)
print(img.shape)
# size属性返回像素个数,不仅仅是width*height,还要乘channels
print(img.size)
# dtype属性返回编码类型 如uint8
print(img.dtype)
# ROI,就是我们想处理的区域都叫ROI,其实就是像素点的集合,举例
# 横坐标从280-340,纵坐标330-390的这段区域,类似于裁剪一样
t = img[280:340,330:390]
cv2.imshow("image",t)
cv2.waitKey(0)
def devideImageTest():
'''
一个彩色图像,假设是RGB三通道的,分解成三个单通道的
:return:
'''
path = "e:/images/1.JPEG"
img = cv2.imread(path)
# img是三通道的,也就是说img本身是一个list,这个list是把像素点一行一行存放的,每一行也是一个list
# 每一行的list里面存放各个位置的像素点,每个像素点都是按照[b,g,r]构成的list,
# 因此img图像是一个三层中括号的list,也就是一个三位数组,第三维就是通道数,012对应bgr
# 先看一下每个通道单独展示是什么结果
cv2.imshow("origin", img)
cv2.imshow("b", img[:, :, 0])
cv2.imshow("g", img[:, :, 1])
cv2.imshow("r", img[:, :, 2])
# 假设把g通道全部变成零,原图像会怎么样?
img[:,:,1] = 0
cv2.imshow("image",img)
cv2.waitKey(0)
# 再把b通道全部变成零,原图像会怎么样?
img[:, :, 0] = 0
cv2.imshow("image", img)
cv2.waitKey(0)
# 再把r通道全部变成零,原图像会怎么样?
img[:, :,2] = 0
cv2.imshow("image", img)
cv2.waitKey(0)
def combineImageTest():
'''
一个彩色图像,成三个单通道的合成一个图像
:return:
'''
path = "e:/images/1.JPEG"
img = cv2.imread(path)
g = img[:, :, 1]
b = img[:, :, 0]
r = img[:, :, 2]
# 单通道图像
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)
# 合成merge(mv, dst=None)
image = cv2.merge((b,g,r))
cv2.imshow("merge",image)
cv2.waitKey(0)
def main():
combineImageTest()
if __name__ == '__main__':
main()