您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python中圖像點(diǎn)運(yùn)算與灰度化處理的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
圖像點(diǎn)運(yùn)算(Point Operation)指對于一幅輸入圖像,將產(chǎn)生一幅輸出圖像,輸出圖像的每個(gè)像素點(diǎn)的灰度值由輸入像素點(diǎn)決定。點(diǎn)運(yùn)算實(shí)際上是灰度到灰度的映射過程,通過映射變換來達(dá)到增強(qiáng)或者減弱圖像的灰度。還可以對圖像進(jìn)行求灰度直方圖、線性變換、非線性變換以及圖像骨架的提取。它與相鄰的像素之間沒有運(yùn)算關(guān)系,是一種簡單和有效的圖像處理方法[1]。
圖像的灰度變換可以通過有選擇的突出圖像感興趣的特征或者抑制圖像中不需要的特征,從而改善圖像的質(zhì)量,凸顯圖像的細(xì)節(jié),提高圖像的對比度。它也能有效地改變圖像的直方圖分布,使圖像的像素值分布更為均勻[2-3]。它在實(shí)際中有很多的應(yīng)用:
光度學(xué)標(biāo)定
對比度增強(qiáng)
對比度擴(kuò)展
顯示標(biāo)定
輪廓線確定
設(shè)輸入圖像為A(x,y),輸出圖像為B(x,y),則點(diǎn)運(yùn)算可以表示為:
圖像點(diǎn)運(yùn)算與幾何運(yùn)算存在差別,不會改變圖像內(nèi)像素點(diǎn)之間的空間位置關(guān)系。同時(shí)與局部(領(lǐng)域)運(yùn)算也存在差別,輸入像素和輸出像素一一對應(yīng)。
圖像灰度化是將一幅彩色圖像轉(zhuǎn)換為灰度化圖像的過程。彩色圖像通常包括R、G、B三個(gè)分量,分別顯示出紅綠藍(lán)等各種顏色,灰度化就是使彩色圖像的R、G、B三個(gè)分量相等的過程?;叶葓D像中每個(gè)像素僅具有一種樣本顏色,其灰度是位于黑色與白色之間的多級色彩深度,灰度值大的像素點(diǎn)比較亮,反之比較暗,像素值最大為255(表示白色),像素值最小為0(表示黑色)。
假設(shè)某點(diǎn)的顏色由RGB(R,G,B)組成,常見灰度處理算法如表11-1所示:
表11-1中Gray表示灰度處理之后的顏色,然后將原始RGB(R,G,B)顏色均勻地替換成新顏色RGB(Gray,Gray,Gray),從而將彩色圖片轉(zhuǎn)化為灰度圖像。一種常見的方法是將RGB三個(gè)分量求和再取平均值,但更為準(zhǔn)確的方法是設(shè)置不同的權(quán)重,將RGB分量按不同的比例進(jìn)行灰度劃分。比如人類的眼睛感官藍(lán)色的敏感度最低,敏感最高的是綠色,因此將RGB按照0.299、0.587、0.144比例加權(quán)平均能得到較合理的灰度圖像,如公式11-2所示[4-6]。
在日常生活中,我們看到的大多數(shù)彩色圖像都是RGB類型,但是在圖像處理過程中,常常需要用到灰度圖像、二值圖像、HSV、HSI等顏色,OpenCV提供了cvtColor()函數(shù)實(shí)現(xiàn)這些功能。其函數(shù)原型如下所示:
dst = cv2.cvtColor(src, code[, dst[, dstCn]])
– src表示輸入圖像,需要進(jìn)行顏色空間變換的原圖像
– dst表示輸出圖像,其大小和深度與src一致
– code表示轉(zhuǎn)換的代碼或標(biāo)識
– dstCn表示目標(biāo)圖像通道數(shù),其值為0時(shí),則有src和code決定
該函數(shù)的作用是將一個(gè)圖像從一個(gè)顏色空間轉(zhuǎn)換到另一個(gè)顏色空間,其中,RGB是指Red、Green和Blue,一副圖像由這三個(gè)通道(channel)構(gòu)成;Gray表示只有灰度值一個(gè)通道;HSV包含Hue(色調(diào))、Saturation(飽和度)和Value(亮度)三個(gè)通道。
在OpenCV中,常見的顏色空間轉(zhuǎn)換標(biāo)識包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS等。下面是調(diào)用cvtColor()函數(shù)將圖像進(jìn)行灰度化處理的代碼。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取原始圖片 src = cv2.imread('luo.png') #圖像灰度化處理 grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #顯示圖像 cv2.imshow("src", src) cv2.imshow("result", grayImage) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
輸出結(jié)果如圖11-1所示,左邊是彩色的“小珞珞”原圖,右邊是將彩色圖像進(jìn)行灰度化處理之后的灰度圖。其中,灰度圖將一個(gè)像素點(diǎn)的三個(gè)顏色變量設(shè)置為相等(R=G=B),此時(shí)該值稱為灰度值。
同樣,可以調(diào)用如下核心代碼將彩色圖像轉(zhuǎn)換為HSV顏色空間,其輸出結(jié)果如圖11-2所示。
grayImage = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
下面代碼對比了九種常見的顏色空間,包括BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB和YUV,并循環(huán)顯示處理后的圖像。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img_BGR = cv2.imread('luo.png') img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB) #BGR轉(zhuǎn)換為RGB img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY) #灰度化處理 img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) #BGR轉(zhuǎn)HSV img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) #BGR轉(zhuǎn)YCrCb img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) #BGR轉(zhuǎn)HLS img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) #BGR轉(zhuǎn)XYZ img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) #BGR轉(zhuǎn)LAB img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) #BGR轉(zhuǎn)YUV #調(diào)用matplotlib顯示處理結(jié)果 titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV'] images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb, img_HLS, img_XYZ, img_LAB, img_YUV] for i in range(9): plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
其運(yùn)行結(jié)果如圖11-3所示:
前面講述了調(diào)用OpenCV中cvtColor()函數(shù)實(shí)現(xiàn)圖像灰度化的處理,接下來講解基于像素操作的圖像灰度化處理方法,主要是最大值灰度處理、平均灰度處理和加權(quán)平均灰度處理方法。
該方法的灰度值等于彩色圖像R、G、B三個(gè)分量中的最大值,公式如下:
其方法灰度化處理后的灰度圖亮度很高,實(shí)現(xiàn)代碼如下。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #獲取圖像高度和寬度 height = img.shape[0] width = img.shape[1] #創(chuàng)建一幅圖像 grayimg = np.zeros((height, width, 3), np.uint8) #圖像最大值灰度處理 for i in range(height): for j in range(width): #獲取圖像R G B最大值 gray = max(img[i,j][0], img[i,j][1], img[i,j][2]) #灰度圖像素賦值 gray=max(R,G,B) grayimg[i,j] = np.uint8(gray) #顯示圖像 cv2.imshow("src", img) cv2.imshow("gray", grayimg) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖11-4所示,其處理效果的灰度偏亮。
該方法的灰度值等于彩色圖像R、G、B三個(gè)分量灰度值的求和平均值,其計(jì)算公式如公式(11-4)所示:
平均灰度處理方法實(shí)現(xiàn)代碼如下。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #獲取圖像高度和寬度 height = img.shape[0] width = img.shape[1] #創(chuàng)建一幅圖像 grayimg = np.zeros((height, width, 3), np.uint8) #圖像平均灰度處理方法 for i in range(height): for j in range(width): #灰度值為RGB三個(gè)分量的平均值 gray = (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2])) / 3 grayimg[i,j] = np.uint8(gray) #顯示圖像 cv2.imshow("src", img) cv2.imshow("gray", grayimg) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖11-5所示:
該方法根據(jù)色彩重要性,將三個(gè)分量以不同的權(quán)值進(jìn)行加權(quán)平均。由于人眼對綠色的敏感最高,對藍(lán)色敏感最低,因此,按下式對RGB三分量進(jìn)行加權(quán)平均能得到較合理的灰度圖像。
加權(quán)平均灰度處理方法實(shí)現(xiàn)代碼如下所示:
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #讀取原始圖像 img = cv2.imread('luo.png') #獲取圖像高度和寬度 height = img.shape[0] width = img.shape[1] #創(chuàng)建一幅圖像 grayimg = np.zeros((height, width, 3), np.uint8) #圖像平均灰度處理方法 for i in range(height): for j in range(width): #灰度加權(quán)平均法 gray = 0.30 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2] grayimg[i,j] = np.uint8(gray) #顯示圖像 cv2.imshow("src", img) cv2.imshow("gray", grayimg) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
其輸出結(jié)果如圖11-6所示:
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python中圖像點(diǎn)運(yùn)算與灰度化處理的示例分析”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。