《OpenCv視覺之眼》Python圖像處理三 :Opencv圖像屬性、ROI區域獲取及通道處理

本專欄主要介紹若是經過OpenCv-Python進行圖像處理,經過原理理解OpenCv-Python的函數處理原型,在具體狀況中,針對不一樣的圖像進行不一樣等級的、不一樣方法的處理,以達到對圖像進行去噪、銳化等一系列的操做。同時,但願觀看本專欄的小夥伴能夠理解到OpenCv進行圖像處理的強大哦,若有轉載,請註明出處(原文連接和做者署名),感謝各位小夥伴啦!python

前文參考:
《OpenCv視覺之眼》Python圖像處理一 :Opencv-python的簡介及Python環境搭建
《OpenCv視覺之眼》Python圖像處理二 :Opencv圖像讀取、顯示、保存基本函數原型及使用

編程

上次博客,咱們介紹了OpneCv圖像讀取、顯示、保存函數原型和基本使用方法,並介紹了程序工做者經常使用的圖像顯示函數,本次博客,林君學長將介紹初步使用OpenCv進行基本的圖像處理,包括圖像屬性獲取、修改像素、像素移植、圖像通道的理解等,而且,深刻介紹圖像通道B\G\R的顏色顯示原理,經過原理了解OpenCv,相信是每一位作圖像處理的一個必要技能,趕快了解原理吧。有不正確的地方,記得提醒林君學長進行改正啦!數組

提示:本片文章須要重點理解的是 3、圖像通道 的理解,所以,小夥伴在對第三部分的理解時候,最好是結合學長的代碼,而後本身書寫代碼進行理解,能夠加深對B\G\R通道顏色造成的理解哦!

網絡

1、圖像屬性

既然是圖像屬性,首先咱們得了解什麼是圖像屬性,一張圖像包括哪些屬性?只有當了解以上兩個問題,才能進行對於的圖像操做,OpenCv對於圖像的操做,本質上能夠理解爲對圖像屬性的相關操做,達到咱們須要的目的,接下來,咱們一塊兒看下圖像包括的屬性有哪些吧!ide

一、圖像屬性

1)、什麼是圖像屬性?
圖像屬性:一張圖片的特性,不一樣的圖片有不一樣的特性,但整體來說,只有如下基本屬性:像素、分辨率、大小、顏色、位深、色調、飽和度、亮度、色彩通道、圖像的層次
2)、圖像屬性種類
經過以上,咱們能夠知道,圖像屬性種類共分爲10個基本屬性,接下來,依次進行屬性介紹吧!


函數

  • 像素

圖像的像素數目(Pixeldimensions),是指在位圖圖像的寬度和高度方向上含有的像素數目。一幅圖像在顯示器上的顯示效果由像素數目和顯示器的設定共同決定。性能

  • 分辨率(Image resolution)

圖像的分辨率是指單位打印長度上的圖像像素的數目,表示圖像數字信息的數量或密度,它決定了圖像的清晰程度。在一樣大小的面積上,圖像的分辨率越高,則組成圖像的像素點越多,像素點越小,圖像的清晰度越高。例如,一幅分辨率爲72dpi的1×1英寸的圖像,它包含的像素數目爲5184,而一幅分辨率爲300dpi的一樣大小的圖像,它包含的像素數目則爲90000。因爲高分辨率的圖像在單位面積上含有更多的像素,因此在打印時可以比低分辨率的圖像更好地表現圖像的細節和微妙的顏色變化。
對於那些在掃描時採用低分辨率獲得的圖像,不能經過提升分辨率的方法來提升圖像的質量,由於這種方法僅僅是將一個像素的信息擴展成了幾個像素的信息,並無從根本上增長像素的數量。另外,在ImageReady中,圖像的分辨率是不能更改的,這是由於ImageReady是專門用來處理在線媒體的圖像的,而不是Photoshop
那樣用來處理打印的圖像的。
設定圖像的分辨率時,應該考慮所製做的圖像的最終發佈媒體,若是製做的圖像是用於在線媒體,只須要使用圖像的分辨率和典型的顯示器的分辨率(72dpi或96dpi)相匹配便可;若是製做的是打印圖像,採用太低的分辨率會使打印出來的圖像顯得粗糙,而採用太高的分辨率,則會使圖像的像素比打印裝置所可以提供的像素小,致使文件的增大和打印時間的延長。並且,對於分辨率太高的圖像,打印設備未必可以正常工做。


優化

  • 圖像大小(File Size)

圖像文件的大小首先決定了圖像文件所需的磁盤存儲空間,它通常以字節(byte)來度量,其計算公式爲:字節數=(位圖高×位圖寬×圖像深度)/8從計算公式能夠看出來,圖像文件的大小與像素數目直接相關。雖然含有較多像素的圖像在打印時可以更好地表現圖像的細節,可是它們須要更大的存儲空間,而且編輯和打印的時間相對地要長一些。例如,一幅分辨率爲200dpi的1×1英寸的圖像,它包含的像素數目是分辨率爲100dpi的1×1英寸的圖像的4倍,其大小天然也是後者的4倍。因此,設定圖像的分辨率時應綜合考慮圖像的質量和大小,找到它們的最佳結合點。Photoshop所可以支持的最大圖像文件是2GB,最大的像素數目是30000×30000像素,這就對打印大小和圖像的分辨率產生了必定的限制。例如,一幅100×100英寸的圖像,它可以獲得的最大分辨率是300dpi(300像素/100英寸)編碼

  • 圖像顏色(Image Color)

圖像顏色是指一幅圖像中所具備的最多的顏色種類,經過圖像處理軟件,能夠很容易地改變三原色的比例,混合成任意一種顏色。spa

  • 圖像深度(Image Depth)

圖像深度也稱圖像的位深,是指描述圖像中每一個像素的數據所佔的位數。圖像的每個像素對應的數據一般能夠是1位(bit)或多位字節,用於存放該像素的顏色、亮度等信息,數據位數越多,對應的圖像顏色種類越多。

  • 色調(Tone)

色調就是各類圖像色8彩模式下圖像的原色(例如,RGB模式的圖像的原覺得R、G、B3種)的明暗度,色調的調整也就是對明暗度的調整。色調的範圍爲0—255,總共包括256種色調。例如,灰度模式的就是將白色到黑色間連續劃分爲256個色調,即由白到灰、再由灰到黑。一樣的道理,在RGB模式中則表明了各原色的明暗度,即紅、綠、藍3種原色的明暗度,將紅色加深色就成爲了深紅色。

  • 飽和度(Saturation)

飽和度是指圖像顏色的深度,它代表了色彩的純度,決定於物體反射或投射的特性。飽和度用與色調成必定比便的灰度數量來表示,取值範圍一般爲0%(飽和度最低)–100%(飽和度最高)。調整圖像的飽和度也就是調整圖像的色度,當將一幅圖像的飽和度下降到0%時,就會變成爲一個灰色的圖偈,增長飽和度應付增長其色調。例如調整彩色電視機的飽和度,用戶能夠選擇觀看黑白或彩色的電視節目。對白、黑、灰度色彩的圖像而言,它們是沒有飽和度的。

  • 亮度(Brightness)

亮度是指圖像色彩的明暗程度,是人眼對物本明暗強度的感受,取值爲0%–100%

  • 色彩通道

圖像的色彩通道 圖像三原色按不一樣的比例進行混合能夠產生許多種顏色,保存每一種原色信息及對其可進行調整處理所提供的方式或途徑就是相應顏色的色彩通道。根據應用種類的不一樣,原色的種類也不一樣,如在印刷一中以4個印版來印刷,每一個印版分別印刷青色(Cyan)、品紅(Magenta)、黃色(Yellow)、黑色(Black),一個通道就至關於印刷中的一個印版,每一個通道保存一種顏色的數據。CMYK圖像有青色、品紅、黃色、黑色4種顏色的通道和一個CMYK通道。

  • 圖像層次

圖像的層次在計算機設計系統中,爲更便捷有效地處理圖像素材,一般將它們置於不一樣的層中,而圖像可看做是由若干層圖像疊加而成的。利用圖像處理軟件,可對每層作單獨處理,而不是影響其餘層的圖像內容。在新建一個圖像文件時,系統會自動爲其創建一個背景層,該層至關於一塊畫布,可在上面作貼圖、繪畫及其餘圖像處理工做。若一個圖像有多個圖層,則每一個圖層均具備相同的像素、通道數及格式。

二、獲取圖像屬性

然而,在咱們對圖像處理的過程當中,咱們使用到的圖像屬性無非就是圖像尺寸(高和寬)和圖像通道數,對於彩色圖像來講,爲3通道,對於灰度圖像來講,一般爲單通道,接下來看看如何經過python代碼實現對圖像屬性的獲取吧!
1)、獲取圖像尺寸和通道數

#導入圖像處理庫opencv
import cv2
#讀取圖像
img=cv2.imread("my.jpg")
#獲取圖像尺寸和通道數
h,w,channel=img.shape
#打印獲取的數據
print(h,w,channel)

在這裏插入圖片描述
2)、只獲取圖像尺寸

#導入圖像處理庫opencv
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取圖像
img=cv2.imread("my.jpg")
#獲取圖像尺寸和通道數
h,w=img.shape[0:2]
#打印獲取的數據
print(h,w)

在這裏插入圖片描述

2、ROI興趣區域

ROI興趣區域是對圖像像素的一種基本處理方式,你能夠理解爲一張圖片中你喜歡的部分經過裁剪像素的方式獲取出來,而後進行顯示,具體方法以下所示

一、ROI(region of interest)興趣區域

1)、感興趣區域:機器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規則多邊形等方式勾勒出須要處理的區域,稱爲感興趣區域,ROI。在Halcon、OpenCV、Matlab等機器視覺軟件上經常使用到各類算子(Operator)和函數來求得感興趣區域ROI,並進行圖像的下一步處理。
2)、ROI有什麼用?
ROI屬於IVE技術的一種,IVE指的是Intelligent video encoding, 即智能視頻編碼, IVE技術能夠根據客戶要求對視頻進行智能編碼,並在不損失圖像質量的前提下,優化視頻編碼性能,最終下降網絡帶寬佔用率和減小存儲空間。
在這裏插入圖片描述
在監控畫面中,有些監控區域是不須要被監控或可有可無,例如天空,牆壁, 草地等等監控對象,普通網絡監控攝像機對整個區域進行視頻編碼(壓縮)並傳輸,這樣就給網絡帶寬和視頻存儲帶來了壓力。而ROI智能視頻編碼技術卻很好的解決了這個問題,ROI功能的攝像機可讓用戶選擇畫面中感興趣的區域,啓用ROI功能後,重要的或者移動的區域將會進行高質量無損編碼, 而對那些不移動,不被選擇的區域下降其碼率和圖像質量,進行標準清晰度視頻壓縮,甚至是不傳輸這部分區域視頻,達到節省網絡帶寬佔用和視頻存儲空間。



二、獲取ROI興趣區域

#導入圖像處理庫opencv
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取圖像
img=cv2.imread("my.jpg")
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
#獲取圖像高度200:400,寬度200:500區域的圖像
img1=img[200:400,200:500]
#圖像格式轉換
#顯示圖像
titles = ['原圖', '陳一月的ROI區域']  #標題
images = [img, img1]   #圖像對比顯示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i])  
    plt.title(titles[i])    
    plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述
以上方式,直接截取像素對應區域位置而後進行顯示,獲取一張圖像中你喜歡的部分

三、ROI區域移植

對於ROI區域的獲取在生活中一種照片經常使用的方法就是爲圖片添加水印,將本身喜歡的水印圖片找好,而後添加到你須要設置的圖片上面去,這就是ROI區域移植,經過以下Python代碼進行了解吧!
1)、自身圖像ROI興趣區域移植

#導入圖像處理庫opencv
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取圖像
img=cv2.imread("my.jpg")
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
#獲取圖像高度200:400,寬度200:500區域的圖像
img1=img[200:400,300:500]
img[:200,:200]=img1 #ROI區域移植到原圖上面左上角
#顯示圖像
titles = ['ROI移植', '陳一月的ROI區域']  #標題
images = [img, img1]   #圖像對比顯示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i])  
    plt.title(titles[i])    
    plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述
2)、不一樣圖片興趣區域移植(添加水印)

#導入圖像處理庫opencv
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取第一張圖像
img=cv2.imread("my.jpg")
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
#讀取第二張圖像
img1=cv2.imread("house.jpg")
img1= cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
#獲取第二圖像高度200:400,寬度200:500區域的圖像
img1=img1[200:400,300:500]
img[:200,:200]=img1 #將第二張圖像ROI區域移植到第一張圖像上面左上角
#顯示圖像
titles = ['圖像水印添加', '水印']  #標題
images = [img, img1]   #圖像對比顯示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i])  
    plt.title(titles[i])    
    plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述

3、圖像通道

對於圖像通道的考慮,通常來說只會考慮彩色圖片,也就是2通道圖像,對於單通道的灰度圖咱們不進行考慮;查詢資料咱們能夠知道,彩色圖像的色彩爲三基色B\G\R經過不一樣的比例混合而成,在圖像像素中用[0-255表示]表示B\G\R顏色的深淺。下面,咱們將分別獲取不一樣的通道,而後理解三通道所表示的含義。
Python中對於通道的獲取經過直接對像素數組進行操做實現,如

  • B通道:img[:,:][0]
  • G通道:img[:,:][1]
  • R通道:img[:,:][2]

一、B(Blue)、G(Green)、R(Red)通道

1)、B、G、R通道獲取

#導入圖像處理庫opencv
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取第一張圖像
img=cv2.imread("my.jpg")
#3通道獲取
B=img[:,:,0]
G=img[:,:,1]
R=img[:,:,2]
#打印3通道
print('B',B)
print('G',G)
print('R',R)
#轉顯示格式的目的是由於咱們opencv讀取圖像是以BGR格式讀取,而matplotlib顯示圖像是以RBG格式顯示,所以,咱們須要經過如下函數進行格式轉換,該函數後面會講到哦!
B= cv2.cvtColor(B,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
G= cv2.cvtColor(G,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
R= cv2.cvtColor(R,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
#顯示圖像
titles = ['B通道', 'G通道','R通道']  #標題
images = [B, G,R]   #圖像對比顯示
for i in range(3):
    plt.subplot(1,3,i+1), plt.imshow(images[i])  
    plt.title(titles[i])    
    plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述
2)、固然,除了能夠經過對像素數組操做的方法,咱們該能夠經過split()函數拆分通道,拆分通道代碼以下所示:

B, G, R = cv2.split(img)

經過以上方式得到的3通道圖像和第一種方式是同樣的,所以具體選擇什麼方法和我的愛好有關!

二、通道合併

上面咱們介紹瞭如何對3通道圖像進行通道拆分,既然有拆分就必定有合併,opencv中通道的合併主要經過cv2.merge([B, G, R]) 函數實現,其中的參數變爲BGR通道
1)、通道合併代碼以下所示:

#導入圖像處理庫opencv
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取第一張圖像
img=cv2.imread("my.jpg")
#3通道獲取
B=img[:,:,0]
G=img[:,:,1]
R=img[:,:,2]
#通道合併
img1=cv2.merge([B, G, R])
img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
plt.imshow(img1)  
plt.title('通道合併')    
plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述

三、三通道顏色顯示原理

可能到這裏,不少小夥伴還不能理解BGR爲何表明藍色、綠色和紅色,接下來,咱們提取出圖像中B\G\R三通道不一樣的顏色,讓小夥伴看一下B\G\R爲何說表示的就是三基色,方便你們理解原理
1)、B(Blue)、G(Green)、R(Red)三基色顯示

#導入圖像處理庫opencv
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取第一張圖像
img=cv2.imread("my.jpg")
#獲取圖像高和寬
h,w=img.shape[0:2]

''' 對藍色通道處理, '''
#獲取通道B-藍色
B=img[:,:,0]
#將另外兩通道設爲0
G=np.zeros((h,w),dtype=img.dtype)
R=np.zeros((h,w),dtype=img.dtype)
#合併通道,只保留藍色通道,其餘通道置爲0
img1=cv2.merge([B, G, R])

''' 對綠色通道處理, '''
#獲取通道G-綠色
B1=np.zeros((h,w),dtype=img.dtype)
#將另外兩通道設爲0
G1=img[:,:,1]
R1=np.zeros((h,w),dtype=img.dtype)
#合併通道,只保留綠色通道,其餘通道置爲0
img2=cv2.merge([B1, G1, R1])

''' 對紅色通道處理, '''
#獲取通道R-紅色
B2=np.zeros((h,w),dtype=img.dtype)
#將另外兩通道設爲0
G2=np.zeros((h,w),dtype=img.dtype)
R2=img[:,:,2]
#合併通道,只保留紅色通道,其餘通道置爲0
img3=cv2.merge([B2, G2, R2])

img1= cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
img2= cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
img3= cv2.cvtColor(img3,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式

#顯示圖像
titles = ['B通道', 'G通道','R通道']  #標題
images = [img1, img2,img3]   #圖像對比顯示
for i in range(3):
    plt.subplot(1,3,i+1), plt.imshow(images[i])  
    plt.title(titles[i])    
    plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述
2)、當咱們將各個通道像素提取,而後分別將其餘兩通道像素設置爲0,只單獨保留須要顯示通道的像素,而後咱們即可以看到3基色的顏色表示,經過對以上三基色進行顏色比例的混合,就會獲得其餘的各類顏色,顏色混合比例就是3基色組合一塊兒的像素比例;
在這裏插入圖片描述
3)、這裏咱們須要理解的是,對於一個有三通道的像素來講(例如:[127,234,158]),其中127表示藍色的深淺度,越接近255顏色越深,給咱們的視覺感覺就是越藍,越接近於0顏色越淺,藍色也就越淡,但值得注意的是,0-255這裏表示的是顏色等級,127屬於裏面顏色等級的第128級(從0開始),也就是說,仍是藍色,只是給咱們人眼的視覺感覺不同,呈現出的藍色深淺度不一樣而已;同理,234表示的就是綠色等級、158表示的就是紅色等級。
4)、可是,讓咱們把上面三種顏色組合到一塊兒以後,也就是[127,234,158],給咱們的視覺顏色可能就是其餘顏色了,這就是B\G\R像素混合比例,混合後造成其餘顏色;例如咱們知道的紅藍配紫色,代碼中像素則能夠表示爲有紅色和藍色兩種基色,將綠色設置爲0,如:[127,0,158],這裏表示的是紫色範疇,由於紫色顏色也具備深淺嘛,也就是說,紫色的深淺經過調整藍色通道B和紅色通道R的像素值,以下代碼所示:



#導入圖像處理庫opencv
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #顯示中文
#讀取第一張圖像
img=cv2.imread("my.jpg")
#獲取圖像高和寬
h,w=img.shape[0:2]
#自定義空白圖像,和原圖像尺寸同樣,用於保存紅藍配後的紫色
img1=np.zeros((h,w,3),dtype=img.dtype)
for i in range(h):
    for j in range(w):
        img1[i,j][0]=img[i,j][0]  #B藍色通道保留
        img1[i,j][1]= 0           #綠色通道,設置爲0
        img1[i,j][2]=img[i,j][2]  #紅色通道保留
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
img1= cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)#BGR轉換爲RGB顯示格式
#顯示圖像
titles = ['原圖', '紅藍配紫色']  #標題
images = [img, img1]   #圖像對比顯示
for i in range(2):
    plt.subplot(1,2,i+1), plt.imshow(images[i])  
    plt.title(titles[i])    
    plt.axis('off')#關閉座標軸 設置爲on則表示開啓座標軸
plt.show()#顯示圖像

在這裏插入圖片描述
5)、那麼爲了將紫色設置爲最深的顏色,該怎麼辦呢?及所有都爲紫色,則咱們能夠將紅色通道R和藍色通道B所有設置爲255,這樣獲得的紫色即是最深效果,核心代碼以下所示:

for i in range(h):
    for j in range(w):
        img1[i,j][0]=255          #B藍色通道保留
        img1[i,j][1]= 0           #綠色通道,設置爲0
        img1[i,j][2]=255          #紅色通道保留

在這裏插入圖片描述
相信到這裏,不少小夥伴就明白了B\G\R所屬的意義了吧,其實仍是很簡單的,理解Opencv中顏色顯示原理,即圖像顏色顯示的原理,對後面圖像處理有很是大的意義,同時也是OpenCv圖像處理的入門基礎,小夥伴們必定要理解呀!

以上就是本次博客的所有內容,遇到問題的小夥伴記得留言評論,學長看到會爲你們進行解答的,這個學長不太冷!

真的猛士,勇於直面慘淡的人生,勇於正視淋漓的鮮血。這是怎樣的哀痛者和幸福者?然而造化又經常爲庸人設計,以時間的流駛,來洗滌舊跡,僅使留下淡紅的血色和微漠的悲哀。在這淡紅的血色和微漠的悲哀中,又給人暫得偷生,維持着這似人非人的世界。我不知道這樣的世界什麼時候是一個盡頭! -----魯迅

陳一月的又一天編程歲月^ _ ^

相關文章
相關標籤/搜索