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

一、开发环境

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








猜你喜欢

转载自blog.csdn.net/Smile_Smilling/article/details/79264683