您的位置:首页 > 编程语言 > Python开发

Python-opencv第二篇 图像数据浅析

2018-02-05 23:20 85 查看
一、开发环境

    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:欢迎大神指教,个人觉得代码有点冗余

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: