日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

【图像处理】——图像的灰度化处理(Python实现三种方法——最大值法、平均值法、加权均值法、gamma校正)

發(fā)布時(shí)間:2023/12/10 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【图像处理】——图像的灰度化处理(Python实现三种方法——最大值法、平均值法、加权均值法、gamma校正) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、什么是圖像的灰度化?

二、灰度化的幾種方法(最大值法、平均值法、加權(quán)均值法、gamma校正)

1、直接調(diào)用函數(shù):cv2.cvtColor() 圖像顏色空間轉(zhuǎn)換

2、最大值法

(1)概念

(2)代碼

(3)結(jié)果

3、平均值法

(1)概念

(2)“RuntimeWarning: overflow encountered in ubyte_scalars”問題的解決

(3)代碼

(4)結(jié)果

4、加權(quán)均值法

(1)概念

(2)代碼

(3)結(jié)果

5、gamma校正

(1)概念

(2)代碼

(3)結(jié)果

三、不同方法之間的比較

四、疑問:怎么利用Python創(chuàng)建一個(gè)空的初始化圖像?(np.unit8的應(yīng)用)

1、關(guān)鍵代碼

?2、圖像展示

3、得到灰度圖像矩陣對比

4、利用opencv創(chuàng)建圖像參考代碼(彩色和灰色均有)


?


一、什么是圖像的灰度化?

首先我們知道一張圖片的所有顏色都可以通過RGB值調(diào)節(jié)進(jìn)行表示,如果是一張彩色圖片則RBG值不一定相同,將彩色圖片灰度化就是指的是將彩色圖片變成黑白的,這時(shí)候的RBG三個(gè)通道的值是相同的,就是將一幅色彩圖像轉(zhuǎn)化為灰度圖像的過程。

彩色圖像分為R,G,B三個(gè)分量,分別顯示出紅綠藍(lán)等各種顏色,灰度化就是使彩色的R,G,B分量相等的過程。灰度值大的像素點(diǎn)比較亮(像素值最大為255,為白色),反之比較暗(像素最下為0,為黑色)這個(gè)過程就是指灰度化,具體可見:《百度百科》

對圖像灰度化便于后續(xù)對圖像的特征進(jìn)行提取,以及得到圖像的灰度曲線圖

?

二、灰度化的幾種方法(最大值法、平均值法、加權(quán)均值法、gamma校正)

這里以上述經(jīng)典圖片為例進(jìn)行灰度化處理

1、直接調(diào)用函數(shù):cv2.cvtColor() 圖像顏色空間轉(zhuǎn)換

img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #灰度化:彩色圖像轉(zhuǎn)為灰度圖像img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB) #彩色化:灰度圖像轉(zhuǎn)為彩色圖像# cv2.COLOR_X2Y,其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

opencv自帶的一個(gè)函數(shù)可以將彩色轉(zhuǎn)化為灰色,通過顏色空間的轉(zhuǎn)換來得到灰度化后的圖片

import cv2def gray_cvt(inputimagepath,windowname,outimagepath):img = cv2.imread(inputimagepath)gray_cvt_image = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)#灰度化cv2.namedWindow(windowname) # 這行沒啥用 控制顯示圖片窗口的名字cv2.imshow(windowname, gray_cvt_image)#顯示灰度化后的圖像cv2.imwrite(outimagepath, gray_cvt_image) # 保存當(dāng)前灰度值處理過后的文件cv2.waitKey()#等待操作cv2.destroyAllWindows()#關(guān)閉顯示圖像的窗口def main():inputimagepath="colorful_lena.jpg"windowname='gray_cvt'outimagepath="gray_cvt.jpg"gray_cvt(inputimagepath,windowname,outimagepath)if __name__ == '__main__':main()

返回的是一個(gè)(200,200)的圖像,是一個(gè)二維數(shù)組,這里的元素值就是B=G=R值

直接調(diào)用函數(shù)cv2.cvt

2、最大值法

(1)概念

灰度化后的R,G,B得值等于轉(zhuǎn)化前3個(gè)值中最大的一個(gè),即:

R=G=B=max(R,G,B)

(2)代碼

import cv2def gray_max_rgb(inputimagepath,windowname,outimagepath):img = cv2.imread(inputimagepath)#讀取圖像,返回的是一個(gè)裝有每一個(gè)像素點(diǎn)的bgr值的三維矩陣gray_max_rgb_image = img.copy()#復(fù)制圖像,用于后面保存灰度化后的圖像bgr值矩陣img_shape = img.shape#返回一位數(shù)組(高,寬,3)獲得原始圖像的長寬以及顏色通道數(shù),一般彩色的顏色通道為3,黑白為1for i in range(img_shape[0]):#按行讀取圖片的像素bgrfor j in range(img_shape[1]):#對每一行按照列進(jìn)行每一個(gè)像素格子進(jìn)行讀取gray_max_rgb_image[i,j] = max(img[i,j][0],img[i,j][1],img[i,j][2])#求灰度值print(gray_max_rgb_image)cv2.namedWindow(windowname) #控制顯示圖片窗口的名字cv2.imshow(windowname, gray_max_rgb_image)#顯示灰度化后的圖像cv2.imwrite(outimagepath, gray_max_rgb_image) # 保存當(dāng)前灰度值處理過后的文件cv2.waitKey()#等待操作cv2.destroyAllWindows()#關(guān)閉顯示圖像的窗口def main():inputimagepath = "colorful_lena.jpg"windowname = "gray_max_rgb"outimagepath = "gray_max_rgb.jpg"gray_max_rgb(inputimagepath,windowname,outimagepath)if __name__ == '__main__':main()

(3)結(jié)果

返回的是一個(gè)三維矩陣,只是第三維比較特殊,三個(gè)元素都是一樣的,即R=B=G

print(gray_max_rgb_image)#取最后一維的第一組數(shù)據(jù)作為參考

最大值法

3、平均值法

(1)概念

灰度化后R,G,B的值為轉(zhuǎn)化前R,G,B的平均值。即:

?R=G=B=(R+G+B)/3 ?

(2)“RuntimeWarning: overflow encountered in ubyte_scalars問題的解決

這個(gè)表明像素值在進(jìn)行加減操作后出現(xiàn)了像素值的溢出現(xiàn)象,即像素值的值為0-255,如果小于0或者大于255就會(huì)出現(xiàn)這種錯(cuò)誤,這種情況也可以得到一個(gè)轉(zhuǎn)換后的圖像但是圖片卻失真了

? RuntimeWarning: overflow encountered in ubyte_scalars gray_mean_rgb_image[i,j] = (img[i,j][0]+img[i,j][1]+img[i,j][2])/3

解決這種方法就是在進(jìn)行像素的加減操作前將像素進(jìn)行強(qiáng)制取整操作即可

gray_mean_rgb_image[i,j] = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3

(3)代碼

#平均值法進(jìn)行圖像灰度化 import cv2def gray_mean_rgb(inputimagepath,windowname,outimagepath):img = cv2.imread(inputimagepath)gray_mean_rgb_image = img.copy()img_shape = img.shapefor i in range(img_shape[0]):for j in range(img_shape[1]):gray_mean_rgb_image[i,j] = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3print(gray_mean_rgb_image)cv2.namedWindow(windowname) #控制顯示圖片窗口的名字cv2.imshow(windowname, gray_mean_rgb_image)#顯示灰度化后的圖像cv2.imwrite(outimagepath, gray_mean_rgb_image) # 保存當(dāng)前灰度值處理過后的文件cv2.waitKey()#等待操作cv2.destroyAllWindows()#關(guān)閉顯示圖像的窗口def main():inputimagepath = "colorful_lena.jpg"windowname = "gray_mean_rgb"outimagepath = "gray_mean_rgb.jpg"gray_mean_rgb(inputimagepath,windowname,outimagepath)if __name__ == '__main__':main()

(4)結(jié)果

print(gray_mean_rgb_image)#取最后一維的第一組數(shù)據(jù)作為參考

平均值法

?

4、加權(quán)均值法

(1)概念

灰度化后按照一定權(quán)值,對R,G,B的值加權(quán)平均,即:

分別為R,G,B的權(quán)值,取不同的值形成不同的灰度圖像。由于人眼對綠色最為敏感,紅色次之,對藍(lán)色的敏感性最低,因此使將得到較易識(shí)別的灰度圖像。一般時(shí),得到的灰度圖像效果最好

注:一般權(quán)重有兩套值供選擇

Gray= 0.072169B+ 0.715160G+ 0.212671RGray= 0.11B+ 0.59G+ 0.3R

前一種是OpenCV開放庫所采用的灰度權(quán)值,后一種為從人體生理學(xué)角度所提出的一種權(quán)值(人眼對綠色的敏感最高,對藍(lán)色敏感最低)?

(2)代碼

#加權(quán)均值法進(jìn)行圖像灰度化 import cv2def gray_weightmean_rgb(wr,wg,wb,inputimagepath,windowname,outimagepath):img = cv2.imread(inputimagepath)gray_weightmean_rgb_image = img.copy()img_shape = img.shapefor i in range(img_shape[0]):for j in range(img_shape[1]):gray_weightmean_rgb_image[i,j] = (int(wr*img[i,j][2])+int(wg*img[i,j][1])+int(wb*img[i,j][0]))/3print(gray_weightmean_rgb_image)cv2.namedWindow(windowname) #控制顯示圖片窗口的名字cv2.imshow(windowname, gray_weightmean_rgb_image)#顯示灰度化后的圖像cv2.imwrite(outimagepath, gray_weightmean_rgb_image) # 保存當(dāng)前灰度值處理過后的文件cv2.waitKey()#等待操作cv2.destroyAllWindows()#關(guān)閉顯示圖像的窗口def main():wr = 0.299wg = 0.587wb = 0.114inputimagepath = "colorful_lena.jpg"windowname = "gray_weightmean_rgb"outimagepath = "gray_weightmean_rgb.jpg"gray_weightmean_rgb(wr,wg,wb,inputimagepath,windowname,outimagepath)if __name__ == '__main__':main()

(3)結(jié)果

print(gray_weightmean_rgb_image)#取最后一維的第一組數(shù)據(jù)作為參考

加權(quán)均值法

5、gamma校正

(1)概念

(2)代碼

#gamma校正加權(quán)均值進(jìn)行圖像灰度化 import cv2def gray_gamma_weightmean_rgb(wr,wg,wb,gamma,inputimagepath,windowname,outimagepath):img = cv2.imread(inputimagepath)gray_gamma_weightmean_rgb_image = img.copy()img_shape = img.shapefor i in range(img_shape[0]):for j in range(img_shape[1]):fenzi = int((wr*img[i,j][2])**gamma)+int((wg*img[i,j][1])**gamma)+int((wb*img[i,j][0])**gamma)fenmu = wr**gamma + wg**gamma + wb**gammagray_gamma_weightmean_rgb_image[i,j] = int((fenzi/fenmu)**(1/gamma))print(gray_gamma_weightmean_rgb_image)cv2.namedWindow(windowname) #控制顯示圖片窗口的名字cv2.imshow(windowname, gray_gamma_weightmean_rgb_image)#顯示灰度化后的圖像cv2.imwrite(outimagepath, gray_gamma_weightmean_rgb_image) # 保存當(dāng)前灰度值處理過后的文件cv2.waitKey()#等待操作cv2.destroyAllWindows()#關(guān)閉顯示圖像的窗口def main():wr = 1wg = 1.5wb = 0.6gamma = 2.2inputimagepath = "colorful_lena.jpg"windowname = "gray_gamma_weightmean_rgb"outimagepath = "gray_gamma_weightmean_rgb.jpg"gray_gamma_weightmean_rgb(wr,wg,wb,gamma,inputimagepath,windowname,outimagepath)if __name__ == '__main__':main()

(3)結(jié)果

print(gray_gamma_weightmean_rgb_image)#取最后一維的第一組數(shù)據(jù)作為參考

gamma修正法

三、不同方法之間的比較

由上圖進(jìn)行各個(gè)灰度化結(jié)果比較可以清晰的看出:

1、最大值法灰度化后圖像過于亮,丟失的圖像細(xì)節(jié)較多,常用于對原本色調(diào)較暗的圖像進(jìn)行處理

2、加權(quán)平均值法灰度化后過于暗,不易于進(jìn)行目標(biāo)對象與背景區(qū)域的區(qū)分,常用于對原本色調(diào)較亮的圖像進(jìn)行處理

3、直接調(diào)用函數(shù)進(jìn)行灰度化顏色依舊偏暗

4、gamma修正灰度化的效果很好,但是gamma修正法的系數(shù)太多,而且設(shè)計(jì)到了指數(shù)以及開方運(yùn)算,運(yùn)算時(shí)間長,對于大量圖片的處理更是不適用,對設(shè)備的要求非常高

5、均值的效果跟gamma修正法差不多,可能不及gamma修正法,但是其方法計(jì)算便捷,且結(jié)果較佳

因此一般使用均值法進(jìn)行圖片的灰度處理

四、疑問:怎么利用Python創(chuàng)建一個(gè)空的初始化圖像?(np.unit8的應(yīng)用)

《如何利用numpy創(chuàng)建全0,全1,隨機(jī)矩陣》

??????? 在上述的灰度化中,灰度化后得到的圖像矩陣均為三維的矩陣,只是最后一維的3個(gè)元素是相同的,但是實(shí)際上灰色圖片的像素值矩陣只需要兩個(gè)維度就可以進(jìn)行完全地表達(dá),即只需要裝一個(gè)灰度值就可以了,這時(shí)候就可以通過numpy先創(chuàng)建一個(gè)合適尺寸的數(shù)組,然后將灰度化后的值去覆蓋定義的數(shù)組即可,注意一點(diǎn):通過numpy創(chuàng)建數(shù)組后,必須要將生成數(shù)組的格式轉(zhuǎn)換為uint8(無符號8位整形)格式,否則應(yīng)用cv2.imshow時(shí)圖像不能顯示,通過np.uint8來指定創(chuàng)建數(shù)組的元素的數(shù)據(jù)類型

gray_max_rgb_image = np.zeros((img_shape[0], img_shape[1]), np.uint8)

?????? 這里以最大值法為例:

1、關(guān)鍵代碼

# gray_max_rgb_image = img.copy()#復(fù)制圖像,用于后面保存灰度化后的圖像bgr值矩陣img_shape = img.shape#返回一位數(shù)組(高,寬,3)獲得原始圖像的長寬以及顏色通道數(shù),一般彩色的顏色通道為3,黑白為1gray_max_rgb_image = np.zeros((img_shape[0], img_shape[1]), np.uint8)#創(chuàng)建一個(gè)與原始圖像大小一致的圖像,初始值為0,即為黑色cv2.imshow('',gray_max_rgb_image)#這里得到的是一個(gè)與原始圖像一樣大小的黑色初始圖像for i in range(img_shape[0]):#按行讀取圖片的像素bgrfor j in range(img_shape[1]):#對每一行按照列進(jìn)行每一個(gè)像素格子進(jìn)行讀取gray_max_rgb_image[i,j] = max(img[i,j][0],img[i,j][1],img[i,j][2])#求灰度值cv2.imshow('',gray_max_rgb_image)#這里得到的是灰度化后的圖像

?2、圖像展示

創(chuàng)建的圖像:

創(chuàng)建的圖像

灰度化后的圖像:

最大值法

3、得到灰度圖像矩陣對比

??????? 利用原始圖像的矩陣shape進(jìn)行的灰度化的圖像矩陣,shape為(200,200,3),且可以看到最后一維三個(gè)數(shù)值是一樣的,即RGB值均相等。

????? 利用創(chuàng)建的數(shù)組進(jìn)行灰度化的圖像矩陣,shape為(200,200),這里只保留了一個(gè)灰度值

4、利用opencv創(chuàng)建圖像參考代碼(彩色和灰色均有)

import cv2 as cv import numpy as npdef creat_image():'''#創(chuàng)建RGB圖像image = np.zeros([400,400,3],np.uint8) #初始圖片黑色#修改第一個(gè)通道的值image[:,:,0] = np.ones([400,400])*255 #輸出藍(lán)色的圖 第一通道是blue# 修改第二個(gè)通道的值image[:, :, 1] = np.ones([400, 400]) * 255cv.imshow("new_image",image)'''#創(chuàng)建單通道圖像 灰度圖像image = np.zeros([400, 400,1], np.uint8)image[:,:,0] = np.ones([400,400])*127cv.imshow("new_image", image)import cv2 as cv t1 = cv.getTickCount() #獲取時(shí)間 creat_image()t2 = cv.getTickCount() time = (t2-t1)/cv.getTickCount() print("time:%s ms"%(time*1000)) #花了多長時(shí)間 mS cv.waitKey(0) #釋放窗口 cv.destroyAllWindows()

?

總結(jié)

以上是生活随笔為你收集整理的【图像处理】——图像的灰度化处理(Python实现三种方法——最大值法、平均值法、加权均值法、gamma校正)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。