【1】引言
前序已经掌握了如何获取灰度图像的像素,文章链接为:
python学opencv|读取图像(五)读取灰度图像像素-CSDN博客
实际上像素就像一个坐标轴,约束了图像的大小。
但实际上我们在学习过程中,对于同一张图片,将其从彩色转化为灰色,一定改变了它各个像素点上颜色的组成。为此,我们继续深究,查阅每个像素点上的BGR。
为何是BGR而不是RGB,有两个原因:
【a】构成世界各种颜色的三种基色分别是红色(Red)、绿色(Green)和蓝色(Blue),这三种基色可以合起来简称RGB;
【b】计算机往往采用BGR的顺序组成彩色,且每种基色的取值范围都是[0,255]。
因此,我们查询图片每个像素点上的颜色组成时,看到的是按照BGR顺序输出的颜色。
【2】代码测试
【2.1】图片读取
首先完成灰度图片的读取,在pycharm等编辑器中输入下述代码:
import cv2 as cv #引入cv2模块
image=cv.imread("cv019.png",0) #读取图片,将其转化为灰度图
if image is not None: #成功读取图片
cv.imshow('cvtest', image) # 显示为灰度图
cv.imwrite('opencv-gray.jpg', image) #保存灰度图
shape= image.shape
size = image.size
dtype= image.dtype
print('像素大小shape=',shape)
print('总像素个数size=',size)
print('图像数据类型dtype=',dtype)
cv.waitKey() # 图片显示时间
cv.destroyAllWindows() # 释放所有窗口
else: #未找到图片
print("Error: 图片无法加载")
cv019依然是本次测试用的图片:
图1
运行代码后,新获得的图片为:
图2
【2.2】灰度图片像素BGR读取
首先完成灰度图片的读取,在pycharm等编辑器中输入下述代码:
在上述代码中,新增一行,制定读取像素数=[100,100]位置处的图像BGR。
print("像素数为[100,100]位置处的BGR=",image[100,100]) #获取像素数为[100,100]位置处的BGR
此时的完整代码为:
import cv2 as cv #引入cv2模块
image=cv.imread("cv019.png",0) #读取图片,将其转化为灰度图
if image is not None: #成功读取图片
cv.imshow('cvtest', image) # 显示为灰度图
cv.imwrite('opencv-gray.jpg', image) #保存灰度图
shape= image.shape
size = image.size
dtype= image.dtype
print('像素大小shape=',shape)
print('总像素个数size=',size)
print('图像数据类型dtype=',dtype)
print("像素数为[100,100]位置处的BGR=",image[100,100]) #获取像素数为[100,100]位置处的BGR
cv.waitKey() # 图片显示时间
cv.destroyAllWindows() # 释放所有窗口
else: #未找到图片
print("Error: 图片无法加载")
运行代码后,获得的输出为:
图3
在这里,我们看到BGR只输出了一个数,理论上应该输出三个数才对。带着疑问,我们尝试对彩色图像进行BGR读取。
【2.3】彩色图片像素BGR读取
首先完成彩色图片的读取,在pycharm等编辑器中将图片读入的代码改为下述形式:
image=cv.imread("cv019.png") #读取彩色图片
在imread(photoname,colorpar)函数中,photoname代表要读取的图片的名字,colorpar=0时就会输出灰度图片,不输入colorpar参数的值,就不会把彩色图片转为灰度图片。
运行代码后的输出为:
图4
在图4中,会看到BGR确实输出了 三个数,与此同时像素大小shape的输出在垂直和水平方向上的像素大小之外,多出了一个3。
这是因为,如果把BGR每一种颜色都看做一个通道,彩色图片有3个通道,灰度图片只需要一个通道。
所以彩色图片按照顺序输出了BGR值,一共有三个数据;灰度图片只需要输出一个数据。
【2.4】灰度和彩色图片像素BGR读取
改写代码,同时读入灰度和彩色图像:
image=cv.imread("cv019.png") #读取图片,将其转化为灰度图 image1=cv.imread("cv019.png",0) #读取图片,将其转化为灰度图
然后将彩色图像和灰度图像分别保存:
cv.imwrite('opencv-Color.jpg', image) #保存灰度图 cv.imwrite('opencv-Gray.jpg', image1) #保存灰度图
再然后分别将灰度和彩色图片的像素属性进行读取,并对像素位置[500,600]处进行BGR读取:
shape= image.shape size = image.size dtype= image.dtype shape1= image1.shape size1 = image1.size dtype1= image1.dtype print('彩色图像像素大小shape=',shape) print('彩色图像总像素个数size=',size) print('彩色图像的图像数据类型dtype=',dtype) print("彩色图像像素数为[500,600]位置处的BGR=",image[500,600]) #获取像素数为[100,100]位置处的BGR print('灰度图像像素大小shape=', shape1) print('灰度图像总像素个数size=', size1) print('灰度灰度图像的图像数据类型dtype=', dtype1) print("灰度图像像素数为[500,600]位置处的BGR=", image1[500, 600]) # 获取像素数为[100,100]位置处的BGR
运行代码后,获得的彩色图像如图1,灰度图像如图2,其余内容为:
图5
如前所述,彩色图像因为有3个通道,所以输出了BGR三个值;灰度图像只有一个通道,在BGR位置处只输出了一个值。
【3】总结
掌握了获取灰度图像和彩色图像在特定像素位置处的BGR值。经测试发现,彩色图像的BGR会输出三个值,灰度图像的BGR只会输出一个值。