一、开发环境
Python版本:Python3.6
opencv版本:opencv3.4.0
二、实验前提
(1)先熟悉opencv基础指令:
http://blog.csdn.net/smile_smilling/article/details/79183022
(2)熟悉numpy基础指令:
https://zhuanlan.zhihu.com/p/24309547
三、实验
img = cv2.imread('a.jpg',1)
print(img.shape) #行、列、通道
print(img.ndim) #维数
print(img) #打印图像数据
(340, 580, 3) #shape
3 #ndim
[[[108 102 55] #data
[109 103 56]
[111 105 58]
...
[117 108 58]
[114 105 55]
[113 104 54]]
[[109 103 56]
[110 104 57]
[111 105 58]
...
[116 107 57]
[113 104 54]
[112 103 53]]
[[111 105 58]
[111 105 58]
[112 106 59]
...
[115 108 58]
[112 105 55]
[110 103 53]]
...
[[110 104 61]
[113 107 64]
[114 109 64]
...
[ 90 94 65]
[ 93 94 60]
[ 98 96 56]]
[[103 97 54]
[106 100 57]
[108 103 58]
...
[ 87 97 74]
[ 90 95 66]
[ 91 92 60]]
[[ 96 90 47]
[100 94 51]
[102 97 52]
...
[100 116 99]
[100 113 91]
[ 99 108 81]]]
由以上数据,可以得出,彩色图片其实是一个三维数组,即为img[340][580][3],分别对应行像素点、列像素点以及BGR。
接下来通过修改数组的数据,来看一下具体现象:
原图:
img[:,:,0] = 255
cv2.imshow('B',img)
运行以上代码之后,得到以下图片
由此可知,第一列表示的是蓝色,将其改为255,则表示把蓝色提高到最大值,也可设置为0,请自己运行代码,对比以下结果
img[:,:,1] = 255
cv2.imshow('G',img)
运行以上代码,可得到以下结果
由此可知,第二列为绿色,则第三列为红色,代码与上面类似,图片如下所示
灰度图:
img = cv2.imread('a.jpg',0)
print(img)
运行以上代码,可以得到如下灰度图
(340, 580)
2
[[ 89 90 92 ... 94 91 90]
[ 90 91 92 ... 93 90 89]
[ 92 92 93 ... 94 91 89]
...
[ 92 95 96 ... 85 84 84]
[ 85 88 90 ... 89 86 82]
[ 78 82 84 ... 109 105 99]]
由输出数据可知,灰度图为二维数组,即img[340][580],与彩色图的数据进行对比,可以得出以下结论:
灰度图的每个数值 = (彩色图B + G + R )/3
通过以下代码进行验证:
grayimg = img[:,:,0]//3+img[:,:,1]//3+img[:,:,2]//3
print(grayimg)
输出结果如下:
[[ 88 88 91 ... 94 91 89]
[ 88 89 91 ... 92 89 88]
[ 91 91 91 ... 93 90 87]
...
[ 90 93 95 ... 82 82 82]
[ 84 87 89 ... 85 83 80]
[ 77 81 83 ... 104 100 96]]
图片如下
全部代码如下:
import cv2
import numpy as np
def show_BGR(pic,colour = 'B',num = 255):
a = 0
name = None
img = cv2.imread(pic)
if colour == 'B':
a = 0
elif colour == 'G':
a = 1
elif colour == 'R':
a = 2
img[:,:,a] = num
cv2.imshow(colour,img)
def show_gray(pic):
#grayimg = (pic[:,:,0]+pic[:,:,1]+pic[:,:,2])/3
grayimg = pic[:,:,0]//3+pic[:,:,1]//3+pic[:,:,2]//3
print(grayimg)
cv2.imshow('gray',grayimg)
def main(pic = '1.jpg'):
img = cv2.imread(pic,1)
print(img)
cv2.imshow('image',img)
show_BGR(pic,'B',255)
show_BGR(pic,'G',255)
show_BGR(pic,'R',255)
show_gray(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
PS:欢迎大神指教,个人觉得代码有点冗余