Python中關(guān)于matplotlib圖片的灰度處理方式
Python中matplotlib圖片的灰度處理
環(huán)境是ubuntu中的jupyter的環(huán)境
圖像的灰度化處理的基本原理
將彩色圖像轉(zhuǎn)化成為灰度圖像的過(guò)程成為圖像的灰度化處理。
為什么要進(jìn)行灰度化處理
彩色圖像中的每個(gè)像素的顏色有R、G、B三個(gè)分量決定,而每個(gè)分量有255中值可取,這樣一個(gè)像素點(diǎn)可以有1600多萬(wàn)(255*255*255)的顏色的變化范圍。
而灰度圖像是R、G、B三個(gè)分量相同的一種特殊的彩色圖像,其一個(gè)像素點(diǎn)的變化范圍為255種,所以在數(shù)字圖像處理種一般先將各種格式的圖像轉(zhuǎn)變成灰度圖像以使后續(xù)的圖像的計(jì)算量變得少一些。
灰度圖像的描述與彩色圖像一樣仍然反映了整幅圖像的整體和局部的色度和亮度等級(jí)的分布和特征。
圖像的灰度化處理可用三種方法來(lái)實(shí)現(xiàn)。
常見的三種方法
- 先對(duì)數(shù)據(jù)進(jìn)行基本的處理
#引入包 import matplotlib.pyplot as plt %matplotlib inline import numpy as np
#讀取文件
zhima=plt.imread('芝麻.jpg')
plt.imshow(zhima)#轉(zhuǎn)變需要的類型,并且產(chǎn)生噪聲,顯示最后的圖片 zhima_noisy=zhima.copy().astype(float) zhima_noisy+=zhima_noisy.std()*0.3*np.random.standard_normal(zhima_noisy.shape) plt.imshow(zhima_noisy)
#查看形狀 zhima.shape #輸出結(jié)果為:(662, 1000, 3)
- 平均值法
#聚合操作后就減少了一個(gè)維度了 zhima_mean=zhima.mean(axis=2) zhima_mean.shape #輸出結(jié)果為:(662, 1000) plt.imshow(zhima_mean,cmap='gray')
- 最大值法
#最大值法 zhima_max=zhima.max(axis=-1) zhima_max.shape plt.imshow(zhima_max,cmap='gray')
- RGB三原色法
gravity= np.array([0.299,0.587,0.114]) #red*0.299+green*0.587+blue*0.114 #矩陣乘法 zhima_gravity=np.dot(zhima,gravity) zhima_gravity.shape plt.imshow(zhima_gravity,cmap='gray')
Matplotlib顯示灰度圖
matplotlib中的imshow()函數(shù)不能自動(dòng)顯示灰度圖像,這一點(diǎn)應(yīng)該是眾所周知的,需要調(diào)用cmap=“gray"以進(jìn)行設(shè)置,但是cmap="gray"實(shí)際上并不是如opencv中的imshow函數(shù)一樣將單通道圖顯示為灰度圖,私以為是引入了灰度圖的灰度量化概念,但并不直接對(duì)應(yīng)灰度,證明見正文。
測(cè)試
設(shè)置一全1.0的圖像(全白),和一全白背景疊加黑色條柱的圖像,使用plt.imshow()顯示。
代碼:
import matplotlib.pyplot as plt
import numpy as np
white=np.ones((100,100),dtype=float)
bar=np.ones((100,100),dtype=float)
bar[40:50,:]=0
plt.figure(1)
plt.subplot(211)
plt.imshow(white,cmap='gray')
plt.title('white map')
plt.subplot(212)
plt.imshow(bar,cmap='gray')
plt.title('black bar')結(jié)果為:

由此可以發(fā)現(xiàn)在值全為1.0時(shí),圖像顯示為黑色,那么是否是dtype的原因呢?測(cè)試常用的uint8情況下,亮度為恒定值,顯示幾何。
代碼為:
white1=np.ones((100,100),dtype=np.uint8)*255
white2=np.ones((100,100),dtype=np.uint8)*128
plt.figure((2))
plt.subplot(211)
plt.imshow(white1,cmap='gray')
plt.title('white1')
plt.subplot(212)
plt.imshow(white2,cmap='gray')
plt.title('white2')結(jié)果為:

由此可以確定,這一顯示“異常”與數(shù)據(jù)類型無(wú)關(guān) 。
解決方案
使用vmin,vmax參數(shù)指定灰度范圍,或者設(shè)定cmap為gray_r以使得灰度范圍反轉(zhuǎn),后者只適用于想顯示白色背景。
代碼:
white1=np.ones((100,100),dtype=np.uint8)*255
white2=np.ones((100,100),dtype=np.uint8)*128
plt.figure((2))
plt.subplot(211)
plt.imshow(white1,cmap='gray_r')
plt.title('white1')
plt.subplot(212)
plt.imshow(white2,cmap='gray',vmin=0,vmax=255)
plt.title('white2')結(jié)果:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Python代碼中執(zhí)行Linux命令的詳細(xì)用法教程
在Python開發(fā)過(guò)程中,經(jīng)常需要執(zhí)行Linux系統(tǒng)命令來(lái)完成各種任務(wù),Python提供了多種方式來(lái)調(diào)用和執(zhí)行系統(tǒng)命令,本文將詳細(xì)介紹如何在Python代碼中執(zhí)行Linux命令,并結(jié)合實(shí)際案例來(lái)演示這些方法的使用,需要的朋友可以參考下2024-07-07
Python根據(jù)服務(wù)獲取端口號(hào)的方法
這篇文章主要介紹了Python根據(jù)服務(wù)獲取端口號(hào),文中給大家提到了linux查看端口開啟端口的方法,需要的朋友可以參考下2019-09-09
python讀取excel進(jìn)行遍歷/xlrd模塊操作
這篇文章主要介紹了python讀取excel進(jìn)行遍歷/xlrd模塊操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
教你用Python寫一個(gè)植物大戰(zhàn)僵尸小游戲
這篇文章主要介紹了教你用Python寫一個(gè)植物大戰(zhàn)僵尸小游戲,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
解決Python3用PIL的ImageFont輸出中文亂碼的問(wèn)題
今天小編大家分享一篇解決Python3用PIL的ImageFont輸出中文亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
pygame實(shí)現(xiàn)雷電游戲雛形開發(fā)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)雷電游戲開發(fā)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11

