python skimage圖像處理(一)

本文轉(zhuǎn)自 python數(shù)字圖像處理

基于python腳本語言開發(fā)的數(shù)字圖片處理包,比如PIL,Pillow, opencv, scikit-image等赚导。
PIL和Pillow只提供最基礎(chǔ)的數(shù)字圖像處理著觉,功能有限痕寓;opencv實(shí)際上是一個c++庫话速,只是提供了python接口,更新速度非常慢凿傅。scikit-image是基于scipy的一款圖像處理包,它將圖片作為numpy數(shù)組進(jìn)行處理数苫,正好與matlab一樣聪舒,因此,我們最終選擇scikit-image進(jìn)行數(shù)字圖像處理虐急。


Image讀出來的是PIL的類型箱残,而skimage.io讀出來的數(shù)據(jù)是numpy格式的

import Image as img
import os
from matplotlib import pyplot as plot
from skimage import io,transform
#Image和skimage讀圖片
img_file1 = img.open('./CXR_png/MCUCXR_0042_0.png')
img_file2 = io.imread('./CXR_png/MCUCXR_0042_0.png')

輸出可以看出Img讀圖片的大小是圖片的(width, height);而skimage的是(height,width, channel), [這也是為什么caffe在單獨(dú)測試時要要在代碼中設(shè)置:transformer.set_transpose('data',(2,0,1))止吁,因?yàn)閏affe可以處理的圖片的數(shù)據(jù)格式是(channel,height,width)被辑,所以要轉(zhuǎn)換數(shù)據(jù)]

#讀圖片后數(shù)據(jù)的大小:
print "the picture's size: ", img_file1.size
print "the picture's shape: ", img_file2.shape
the picture's size:  (4892, 4020)
the picture's shape:  (4020, 4892)
#得到像素:
print(img_file1.getpixel((500,1000)), img_file2[500][1000])
print(img_file1.getpixel((500,1000)), img_file2[1000][500])
print(img_file1.getpixel((1000,500)), img_file2[500][1000])
(0, 139)
(0, 0)
(139, 139)

Img讀出來的圖片獲得某點(diǎn)像素用getpixel((w,h))可以直接返回這個點(diǎn)三個通道的像素值
skimage讀出來的圖片可以直接img_file2[0][0]獲得敬惦,但是一定記住它的格式盼理,并不是你想的(channel,height,width)

圖片信息

如果我們想知道一些skimage圖片信息

from skimage import io, data
img = data.chelsea()
io.imshow(img)
print(type(img))  #顯示類型
print(img.shape)  #顯示尺寸
print(img.shape[0])  #圖片高度
print(img.shape[1])  #圖片寬度
print(img.shape[2])  #圖片通道數(shù)
print(img.size)   #顯示總像素個數(shù)
print(img.max())  #最大像素值
print(img.min())  #最小像素值
print(img.mean()) #像素平均值
print(img[0][0])#圖像的像素值

PIL image 查看圖片信息,可用如下的方法

print type(img)
print img.size  #圖片的尺寸
print img.mode  #圖片的模式
print img.format  #圖片的格式
print(img.getpixel((0,0)))#得到像素:
#img讀出來的圖片獲得某點(diǎn)像素用getpixel((w,h))可以直接返回這個點(diǎn)三個通道的像素值
# 獲取圖像的灰度值范圍
width = img.size[0]
height = img.size[1]

# 輸出圖片的像素值
count = 0 
for i in range(0, width):
    for j in range(0, height):
        if img.getpixel((i, j))>=0 and img.getpixel((i, j))<=255:
            count +=1
print count
print(height*width)

skimage提供了io模塊仁热,顧名思義榜揖,這個模塊是用來圖片輸入輸出操作的。為了方便練習(xí)抗蠢,也提供一個data模塊举哟,里面嵌套了一些示例圖片,我們可以直接使用迅矛。

skimage包的子模塊

skimage包的全稱是scikit-image SciKit (toolkit for SciPy) 妨猩,它對scipy.ndimage進(jìn)行了擴(kuò)展,提供了更多的圖片處理功能秽褒。它是由python語言編寫的壶硅,由scipy 社區(qū)開發(fā)和維護(hù)。skimage包由許多的子模塊組成销斟,各個子模塊提供不同的功能庐椒。主要子模塊列表如下:

子模塊名稱                 主要實(shí)現(xiàn)功能
io                            讀取、保存和顯示圖片或視頻
data                       提供一些測試圖片和樣本數(shù)據(jù)
color                           顏色空間變換
filters             圖像增強(qiáng)蚂踊、邊緣檢測约谈、排序?yàn)V波器、自動閾值等
draw               操作于numpy數(shù)組上的基本圖形繪制,包括線條棱诱、矩形泼橘、圓和文本等
transform          幾何變換或其它變換,如旋轉(zhuǎn)迈勋、拉伸和拉東變換等
morphology          形態(tài)學(xué)操作炬灭,如開閉運(yùn)算、骨架提取等
exposure              圖片強(qiáng)度調(diào)整靡菇,如亮度調(diào)整重归、直方圖均衡等
feature                        特征檢測與提取等
measure                  圖像屬性的測量,如相似性或等高線等
segmentation                          圖像分割
restoration                           圖像恢復(fù)
util                                  通用函數(shù)

從外部讀取圖片并顯示

讀取單張彩色rgb圖片镰官,使用skimage.io.imread(fname)函數(shù),帶一個參數(shù)提前,表示需要讀取的文件路徑。顯示圖片使用skimage.io.imshow(arr)函數(shù)泳唠,帶一個參數(shù)狈网,表示需要顯示的arr數(shù)組(讀取的圖片以numpy數(shù)組形式計(jì)算)。

from skimage import io
img=io.imread('d:/dog.jpg')
io.imshow(img)

讀取單張灰度圖片笨腥,使用skimage.io.imread(fname拓哺,as_grey=True)函數(shù),第一個參數(shù)為圖片路徑脖母,第二個參數(shù)為as_grey, bool型值士鸥,默認(rèn)為False

from skimage import io
img=io.imread('d:/dog.jpg',as_grey=True)
io.imshow(img)

程序自帶圖片
skimage程序自帶了一些示例圖片,如果我們不想從外部讀取圖片谆级,就可以直接使用這些示例圖片:

astronaut     航員圖片      coffee     一杯咖啡圖片   
lena          lena美女圖片   camera   拿相機(jī)的人圖片   
coins           硬幣圖片     moon    月亮圖片
checkerboard   棋盤圖片       horse   馬圖片   
page   書頁圖片              chelsea   小貓圖片     
hubble_deep_field    星空圖片   text   文字圖片
clock    時鐘圖片   immunohistochemistry   結(jié)腸圖片     

顯示這些圖片可用如下代碼烤礁,不帶任何參數(shù)

from skimage import io, data
img=data.lena()
io.imshow(img)

圖片名對應(yīng)的就是函數(shù)名,如camera圖片對應(yīng)的函數(shù)名為camera(). 這些示例圖片存放在skimage的安裝目錄下面肥照,路徑名稱為data_dir,我們可以將這個路徑打印出來看看

from skimage import data_dir
print(data_dir)

保存圖片
使用io模塊的imsave(fname,arr)函數(shù)來實(shí)現(xiàn)脚仔。第一個參數(shù)表示保存的路徑和名稱,第二個參數(shù)表示需要保存的數(shù)組變量舆绎。

from skimage import io,data
img=data.chelsea()
io.imshow(img)
io.imsave('d:/cat.jpg',img)

保存圖片的同時也起到了轉(zhuǎn)換格式的作用鲤脏。如果讀取時圖片格式為jpg圖片,保存為png格式吕朵,則將圖片從jpg圖片轉(zhuǎn)換為png圖片并保存猎醇。

圖片信息

如果我們想知道一些圖片信息

from skimage import io, data
img = data.chelsea()
io.imshow(img)
print(type(img))  #顯示類型
print(img.shape)  #顯示尺寸
print(img.shape[0])  #圖片高度
print(img.shape[1])  #圖片寬度
print(img.shape[2])  #圖片通道數(shù)
print(img.size)   #顯示總像素個數(shù)
print(img.max())  #最大像素值
print(img.min())  #最小像素值
print(img.mean()) #像素平均值
print(img[0][0])#圖像的像素值

圖像像素的訪問與裁剪

圖片讀入程序中后,是以numpy數(shù)組存在的努溃。因此對numpy數(shù)組的一切功能硫嘶,對圖片也適用。對數(shù)組元素的訪問梧税,實(shí)際上就是對圖片像素點(diǎn)的訪問音半。

彩色圖片訪問方式為:img[i,j,c]
i表示圖片的行數(shù)则拷,j表示圖片的列數(shù),c表示圖片的通道數(shù)(RGB三通道分別對應(yīng)0曹鸠,1,2)斥铺。坐標(biāo)是從左上角開始彻桃。

灰度圖片訪問方式為:gray[i,j]

例1:輸出小貓圖片的G通道中的第20行30列的像素值

from skimage import io,data
img=data.chelsea()
pixel=img[20,30,1]
print(pixel)

例2:顯示紅色單通道圖片

from skimage import io,data
img=data.chelsea()
R=img[:,:,0]
io.imshow(R)

除了對像素進(jìn)行讀取,也可以修改像素值晾蜘。

例3:對小貓圖片隨機(jī)添加椒鹽噪聲

from skimage import io,data
import numpy as np
img=data.chelsea()

#隨機(jī)生成5000個椒鹽
rows,cols,dims=img.shape
for i in range(5000):
    x=np.random.randint(0,rows)
    y=np.random.randint(0,cols)
    img[x,y,:]=255
io.imshow(img)

這里用到了numpy包里的random來生成隨機(jī)數(shù)邻眷,randint(0,cols)表示隨機(jī)生成一個整數(shù),范圍在0到cols之間剔交。
用img[x,y,:]=255這句來對像素值進(jìn)行修改肆饶,將原來的三通道像素值,變?yōu)?55

通過對數(shù)組的裁剪岖常,就可以實(shí)現(xiàn)對圖片的裁剪驯镊。
例4:對小貓圖片進(jìn)行裁剪

from skimage import io,data
img=data.chelsea()
roi=img[80:180,100:200,:]
io.imshow(roi)

對多個像素點(diǎn)進(jìn)行操作,使用數(shù)組切片方式訪問竭鞍。切片方式返回的是以指定間隔下標(biāo)訪問 該數(shù)組的像素值板惑。下面是有關(guān)灰度圖像的一些例子:

img[i,:] = im[j,:] # 將第 j 行的數(shù)值賦值給第 i 行
img[:,i] = 100 # 將第 i 列的所有數(shù)值設(shè)為 100
img[:100,:50].sum() # 計(jì)算前 100 行、前 50 列所有數(shù)值的和
img[50:100,50:100] # 50~100 行偎快,50~100 列(不包括第 100 行和第 100 列)
img[i].mean() # 第 i 行所有數(shù)值的平均值
img[:,-1] # 最后一列
img[-2,:] (or im[-2]) # 倒數(shù)第二行

最后我們再看兩個對像素值進(jìn)行訪問和改變的例子:

例5:將lena圖片進(jìn)行二值化冯乘,像素值大于128的變?yōu)?,否則變?yōu)?

from skimage import io,data,color
img=data.lena()
img_gray=color.rgb2gray(img)
rows,cols=img_gray.shape
for i in range(rows):
    for j in range(cols):
        if (img_gray[i,j]<=0.5):
            img_gray[i,j]=0
        else:
            img_gray[i,j]=1
io.imshow(img_gray)

使用了color模塊的rgb2gray()函數(shù)晒夹,將彩色三通道圖片轉(zhuǎn)換成灰度圖裆馒。轉(zhuǎn)換結(jié)果為float64類型的數(shù)組,范圍為[0,1]之間丐怯。

將彩色三通道圖片轉(zhuǎn)換成灰度圖,最后變成unit8, float轉(zhuǎn)換為unit8是有信息損失的喷好。

img_path = 'data/dpclassifier/newtrain/test/1_0.png'
import Image as img
import os
from matplotlib import pyplot as plot
from skimage import io,transform, img_as_ubyte
img_file1 = img.open(img_path)
img_file1.show()
img_file2 = io.imread(img_path)
io.imshow(img_file2)
print(type(img_file1),img_file1.mode, type(img_file2),img_file2.shape, img_file2.dtype,img_file2.max(),img_file2.min(),img_file2.mean())

img_file22=skimage.color.rgb2gray(img_file2)
print(type(img_file22),img_file22.shape,img_file22.dtype,img_file22.max(),img_file22.min(),img_file22.mean() )
dst=img_as_ubyte(img_file22)
print(type(dst),dst.shape,dst.dtype, dst.max(), dst.min(), dst.mean())

結(jié)果

(<class 'PIL.PngImagePlugin.PngImageFile'>, 'RGB', <type 'numpy.ndarray'>, (420, 512, 3), dtype('uint8'), 255, 0, 130.9983863467262)
(<type 'numpy.ndarray'>, (420, 512), dtype('float64'), 1.0, 0.0, 0.5137191621440242)
(<type 'numpy.ndarray'>, (420, 512), dtype('uint8'), 255, 0, 130.9983863467262)

例6:

from skimage import io,data
img=data.chelsea()
reddish = img[:, :, 0] >170
img[reddish] = [0, 255, 0]
io.imshow(img)

這個例子先對R通道的所有像素值進(jìn)行判斷,如果大于170响逢,則將這個地方的像素值變?yōu)閇0,255,0], 即G通道值為255绒窑,R和B通道值為0。


圖像數(shù)據(jù)類型及顏色空間轉(zhuǎn)換

在skimage中舔亭,一張圖片就是一個簡單的numpy數(shù)組些膨,數(shù)組的數(shù)據(jù)類型有很多種,相互之間也可以轉(zhuǎn)換钦铺。這些數(shù)據(jù)類型及取值范圍如下表所示:

Data type   Range
uint8     0 to 255
uint16    0 to 65535
uint32    0 to 232
float    -1 to 1 or 0 to 1
int8      -128 to 127
int16    -32768 to 32767
int32    -231 to 231 - 1

一張圖片的像素值范圍是[0,255], 因此默認(rèn)類型是unit8, 可用如下代碼查看數(shù)據(jù)類型

from skimage import io,data
img=data.chelsea()
print(img.dtype.name)

在上面的表中订雾,特別注意的是float類型,它的范圍是[-1,1]或[0,1]之間矛洞。一張彩色圖片轉(zhuǎn)換為灰度圖后洼哎,它的類型就由unit8變成了float
1烫映、unit8轉(zhuǎn)float

from skimage import data,img_as_float
img=data.chelsea()
print(img.dtype.name)
dst=img_as_float(img)
print(dst.dtype.name)

2、float轉(zhuǎn)uint8

from skimage import img_as_ubyte
import numpy as np
img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)
dst=img_as_ubyte(img)
print(dst.dtype.name)

float轉(zhuǎn)為unit8噩峦,有可能會造成數(shù)據(jù)的損失锭沟,因此會有警告提醒。*

除了這兩種最常用的轉(zhuǎn)換以外识补,其實(shí)有一些其它的類型轉(zhuǎn)換族淮,如下表:

Function name   Description
img_as_float    Convert to 64-bit floating point.
img_as_ubyte    Convert to 8-bit uint.
img_as_uint     Convert to 16-bit uint.
img_as_int      Convert to 16-bit int.

如前所述,除了直接轉(zhuǎn)換可以改變數(shù)據(jù)類型外凭涂,還可以通過圖像的顏色空間轉(zhuǎn)換來改變數(shù)據(jù)類型祝辣。

常用的顏色空間有灰度空間、rgb空間切油、hsv空間和cmyk空間蝙斜。顏色空間轉(zhuǎn)換以后,圖片類型都變成了float型澎胡。

所有的顏色空間轉(zhuǎn)換函數(shù)孕荠,都放在skimage的color模塊內(nèi)。
例:rgb轉(zhuǎn)灰度圖

from skimage import io,data,color
img=data.lena()
gray=color.rgb2gray(img)
io.imshow(gray)

其它的轉(zhuǎn)換滤馍,用法都是一樣的岛琼,列舉常用的如下:

skimage.color.rgb2grey(rgb)
skimage.color.rgb2hsv(rgb)
skimage.color.rgb2lab(rgb)
skimage.color.gray2rgb(image)
skimage.color.hsv2rgb(hsv)
skimage.color.lab2rgb(lab)

實(shí)際上,上面的所有轉(zhuǎn)換函數(shù)巢株,都可以用一個函數(shù)來代替

skimage.color.convert_colorspace(arr, fromspace, tospace)

表示將arr從fromspace顏色空間轉(zhuǎn)換到tospace顏色空間槐瑞。

例:rgb轉(zhuǎn)hsv

from skimage import io,data,color
img=data.lena()
hsv=color.convert_colorspace(img,'RGB','HSV')
io.imshow(hsv)

在color模塊的顏色空間轉(zhuǎn)換函數(shù)中,還有一個比較有用的函數(shù)是
skimage.color.label2rgb(arr), 可以根據(jù)標(biāo)簽值對圖片進(jìn)行著色阁苞。以后的圖片分類后著色就可以用這個函數(shù)困檩。

例:將lena圖片分成三類,然后用默認(rèn)顏色對三類進(jìn)行著色

from skimage import io,data,color
import numpy as np
img=data.lena()
gray=color.rgb2gray(img)
rows,cols=gray.shape
labels=np.zeros([rows,cols])
for i in range(rows):
    for j in range(cols):
        if(gray[i,j]<0.4):
            labels[i,j]=0
        elif(gray[i,j]<0.75):
            labels[i,j]=1
        else:
            labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)

圖像的繪制

實(shí)際上前面我們就已經(jīng)用到了圖像的繪制那槽,如:

io.imshow(img)  

這一行代碼的實(shí)質(zhì)是利用matplotlib包對圖片進(jìn)行繪制悼沿,繪制成功后,返回一個matplotlib類型的數(shù)據(jù)骚灸。因此糟趾,我們也可以這樣寫:

import matplotlib.pyplot as plt
plt.imshow(img)

imshow()函數(shù)格式為:

matplotlib.pyplot.imshow(X, cmap=None)

X: 要繪制的圖像或數(shù)組。
cmap: 顏色圖譜(colormap), 默認(rèn)繪制為RGB(A)顏色空間甚牲。
其它可選的顏色圖譜如下列表:

顏色圖譜                          描述
autumn                        紅-橙-黃
bone                          黑-白义郑,x線
cool                          青-洋紅
copper                         黑-銅
flag                           紅-白-藍(lán)-黑
gray                              黑-白
hot                            黑-紅-黃-白
hsv                hsv顏色空間, 紅-黃-綠-青-藍(lán)-洋紅-紅
inferno                     黑-紅-黃
jet                             藍(lán)-青-黃-紅
magma                      黑-紅-白
pink                               黑-粉-白
plasma                       綠-紅-黃
prism                         紅-黃-綠-藍(lán)-紫-...-綠模式
spring                             洋紅-黃
summer                             綠-黃
viridis                             藍(lán)-綠-黃
winter                             藍(lán)-綠

用的比較多的有g(shù)ray,jet等丈钙,如:

plt.imshow(image,plt.cm.gray)
plt.imshow(img,cmap=plt.cm.jet)

在窗口上繪制完圖片后非驮,返回一個AxesImage對象。要在窗口上顯示這個對象雏赦,我們可以調(diào)用show()函數(shù)來進(jìn)行顯示劫笙,但進(jìn)行練習(xí)的時候(ipython環(huán)境中)芙扎,一般我們可以省略show()函數(shù),也能自動顯示出來填大。

from skimage import io,data
img=data.astronaut()
dst=io.imshow(img)
print(type(dst))
io.show()

可以看到戒洼,類型是'matplotlib.image.AxesImage'。顯示一張圖片允华,我們通常更愿意這樣寫:

import matplotlib.pyplot as plt
from skimage import io,data
img=data.astronaut()
plt.imshow(img)
plt.show()

matplotlib是一個專業(yè)繪圖的庫施逾,相當(dāng)于matlab中的plot,可以設(shè)置多個figure窗口,設(shè)置figure的標(biāo)題,隱藏坐標(biāo)尺例获,甚至可以使用subplot在一個figure中顯示多張圖片。一般我們可以這樣導(dǎo)入matplotlib庫:

import matplotlib.pyplot as plt

也就是說曹仗,我們繪圖實(shí)際上用的是matplotlib包的pyplot模塊榨汤。

用figure函數(shù)和subplot函數(shù)分別創(chuàng)建主窗口與子圖
分開并同時顯示宇航員圖片的三個通道

from skimage import data
import matplotlib.pyplot as plt
img=data.astronaut()
plt.figure(num='astronaut',figsize=(8,8))  #創(chuàng)建一個名為astronaut的窗口,并設(shè)置大小 

plt.subplot(2,2,1)     #將窗口分為兩行兩列四個子圖,則可顯示四幅圖片
plt.title('origin image')   #第一幅圖片標(biāo)題
plt.imshow(img)      #繪制第一幅圖片

plt.subplot(2,2,2)     #第二個子圖
plt.title('R channel')   #第二幅圖片標(biāo)題
plt.imshow(img[:,:,0],plt.cm.gray)      #繪制第二幅圖片,且為灰度圖
plt.axis('off')     #不顯示坐標(biāo)尺寸

plt.subplot(2,2,3)     #第三個子圖
plt.title('G channel')   #第三幅圖片標(biāo)題
plt.imshow(img[:,:,1],plt.cm.gray)      #繪制第三幅圖片,且為灰度圖
plt.axis('off')     #不顯示坐標(biāo)尺寸

plt.subplot(2,2,4)     #第四個子圖
plt.title('B channel')   #第四幅圖片標(biāo)題
plt.imshow(img[:,:,2],plt.cm.gray)      #繪制第四幅圖片,且為灰度圖
plt.axis('off')     #不顯示坐標(biāo)尺寸

plt.show()   #顯示窗口

在圖片繪制過程中怎茫,我們用matplotlib.pyplot模塊下的figure()函數(shù)來創(chuàng)建顯示窗口收壕,該函數(shù)的格式為:

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)

所有參數(shù)都是可選的,都有默認(rèn)值轨蛤,因此調(diào)用該函數(shù)時可以不帶任何參數(shù)蜜宪,其中:

num: 整型或字符型都可以。如果設(shè)置為整型祥山,則該整型數(shù)字表示窗口的序號圃验。如果設(shè)置為字符型,則該字符串表示窗口的名稱缝呕。用該參數(shù)來命名窗口澳窑,如果兩個窗口序號或名相同,則后一個窗口會覆蓋前一個窗口供常。

figsize: 設(shè)置窗口大小摊聋。是一個tuple型的整數(shù),如figsize=(8栈暇,8)
dpi: 整形數(shù)字麻裁,表示窗口的分辨率。
facecolor: 窗口的背景顏色源祈。
edgecolor: 窗口的邊框顏色煎源。
用figure()函數(shù)創(chuàng)建的窗口,只能顯示一幅圖片新博,如果想要顯示多幅圖片薪夕,則需要將這個窗口再劃分為幾個子圖,在每個子圖中顯示不同的圖片赫悄。我們可以使用subplot()函數(shù)來劃分子圖原献,函數(shù)格式為:

matplotlib.pyplot.subplot(nrows, ncols, plot_number)

nrows: 子圖的行數(shù)馏慨。
ncols: 子圖的列數(shù)。
plot_number: 當(dāng)前子圖的編號姑隅。

如:

plt.subplot(2,2,1)

則表示將figure窗口劃分成了2行2列共4個子圖写隶,當(dāng)前為第1個子圖。我們有時也可以用這種寫法:

plt.subplot(221)

兩種寫法效果是一樣的讲仰。每個子圖的標(biāo)題可用title()函數(shù)來設(shè)置慕趴,是否使用坐標(biāo)尺可用axis()函數(shù)來設(shè)置,如:

plt.subplot(221)
plt.title("first subwindow")
plt.axis('off')  

用subplots來創(chuàng)建顯示窗口與劃分子圖

除了上面那種方法創(chuàng)建顯示窗口和劃分子圖鄙陡,還有另外一種編寫方法也可以冕房,如下例:

import matplotlib.pyplot as plt
from skimage import data,color

img = data.immunohistochemistry()
hsv = color.rgb2hsv(img)

fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()

ax0.imshow(img)
ax0.set_title("Original image")

ax1.imshow(hsv[:, :, 0], cmap=plt.cm.gray)
ax1.set_title("H")

ax2.imshow(hsv[:, :, 1], cmap=plt.cm.gray)
ax2.set_title("S")

ax3.imshow(hsv[:, :, 2], cmap=plt.cm.gray)
ax3.set_title("V")

for ax in axes.ravel():
    ax.axis('off')

fig.tight_layout()  #自動調(diào)整subplot間的參數(shù)

直接用subplots()函數(shù)來創(chuàng)建并劃分窗口。注意趁矾,比前面的subplot()函數(shù)多了一個s耙册,該函數(shù)格式為:

matplotlib.pyplot.subplots(nrows=1, ncols=1)

nrows: 所有子圖行數(shù),默認(rèn)為1毫捣。

ncols: 所有子圖列數(shù)详拙,默認(rèn)為1。

返回一個窗口figure, 和一個tuple型的ax對象蔓同,該對象包含所有的子圖,可結(jié)合ravel()函數(shù)列出所有子圖饶辙,如:

fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()

創(chuàng)建了2行2列4個子圖,分別取名為ax0,ax1,ax2和ax3, 每個子圖的標(biāo)題用set_title()函數(shù)來設(shè)置斑粱,如:

ax0.imshow(img)
ax0.set_title("Original image")

如果有多個子圖弃揽,我們還可以使用tight_layout()函數(shù)來調(diào)整顯示的布局,該函數(shù)格式為:

matplotlib.pyplot.tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None)

所有的參數(shù)都是可選的珊佣,調(diào)用該函數(shù)時可省略所有的參數(shù)蹋宦。
pad: 主窗口邊緣和子圖邊緣間的間距,默認(rèn)為1.08
h_pad, w_pad: 子圖邊緣之間的間距咒锻,默認(rèn)為 pad_inches
rect: 一個矩形區(qū)域冷冗,如果設(shè)置這個值,則將所有的子圖調(diào)整到這個矩形區(qū)域內(nèi)惑艇。
一般調(diào)用為:

plt.tight_layout()  #自動調(diào)整subplot間的參數(shù)

其它方法繪圖并顯示
除了使用matplotlib庫來繪制圖片蒿辙,skimage還有另一個子模塊viewer,也提供一個函數(shù)來顯示圖片滨巴。不同的是思灌,它利用Qt工具來創(chuàng)建一塊畫布,從而在畫布上繪制圖像恭取。

例:

from skimage import data
from skimage.viewer import ImageViewer
img = data.coins()
viewer = ImageViewer(img)
viewer.show()

最后總結(jié)一下泰偿,繪制和顯示圖片常用到的函數(shù)有:

函數(shù)名     功能  調(diào)用格式
figure  創(chuàng)建一個顯示窗口    plt.figure(num=1,figsize=(8,8)
imshow  繪制圖片    plt.imshow(image)
show    顯示窗口    plt.show()
subplot     劃分子圖    plt.subplot(2,2,1)
title   設(shè)置子圖標(biāo)題(與subplot結(jié)合使用)    plt.title('origin image')
axis    是否顯示坐標(biāo)尺     plt.axis('off')
subplots    創(chuàng)建帶有多個子圖的窗口     fig,axes=plt.subplots(2,2,figsize=(8,8))
ravel   為每個子圖設(shè)置變量   ax0,ax1,ax2,ax3=axes.ravel()
set_title   設(shè)置子圖標(biāo)題(與axes結(jié)合使用)   ax0.set_title('first window')
tight_layout    自動調(diào)整子圖顯示布局  plt.tight_layout()

圖像的批量處理

有些時候,我們不僅要對一張圖片進(jìn)行處理蜈垮,可能還會對一批圖片處理耗跛。這時候裕照,我們可以通過循環(huán)來執(zhí)行處理,也可以調(diào)用程序自帶的圖片集合來處理调塌。
圖片集合函數(shù)為:

skimage.io.ImageCollection(load_pattern,load_func=None)

這個函數(shù)是放在io模塊內(nèi)的晋南,帶兩個參數(shù),第一個參數(shù)load_pattern, 表示圖片組的路徑羔砾,可以是一個str字符串负间。第二個參數(shù)load_func是一個回調(diào)函數(shù),我們對圖片進(jìn)行批量處理就可以通過這個回調(diào)函數(shù)實(shí)現(xiàn)姜凄≌#回調(diào)函數(shù)默認(rèn)為imread(),即默認(rèn)這個函數(shù)是批量讀取圖片。
先看一個例子:

import skimage.io as io
from skimage import data_dir
str=data_dir + '/*.png'
coll = io.ImageCollection(str)
print(len(coll))

顯示結(jié)果為25, 說明系統(tǒng)自帶了25張png的示例圖片态秧,這些圖片都讀取了出來玩祟,放在圖片集合coll里。如果我們想顯示其中一張圖片屿聋,則可以在后加上一行代碼:

io.imshow(coll[10])

顯示為:


如果一個文件夾里,我們既存放了一些jpg格式的圖片藏鹊,又存放了一些png格式的圖片润讥,現(xiàn)在想把它們?nèi)孔x取出來,該怎么做呢?

import skimage.io as io
from skimage import data_dir
str='d:/pic/*.jpg:d:/pic/*.png'
coll = io.ImageCollection(str)
print(len(coll))

注意這個地方'd:/pic/.jpg:d:/pic/.png' 盘寡,是兩個字符串合在一起的楚殿,第一個是'd:/pic/.jpg', 第二個是'd:/pic/.png' ,合在一起后竿痰,中間用冒號來隔開脆粥,這樣就可以把d:/pic/文件夾下的jpg和png格式的圖片都讀取出來。如果還想讀取存放在其它地方的圖片影涉,也可以一并加進(jìn)去变隔,只是中間同樣用冒號來隔開。
io.ImageCollection()這個函數(shù)省略第二個參數(shù)蟹倾,就是批量讀取匣缘。如果我們不是想批量讀取,而是其它批量操作鲜棠,如批量轉(zhuǎn)換為灰度圖肌厨,那又該怎么做呢?
那就需要先定義一個函數(shù)豁陆,然后將這個函數(shù)作為第二個參數(shù)柑爸,如:

from skimage import data_dir,io,color
def convert_gray(f): 
       rgb=io.imread(f) 
       return color.rgb2gray(rgb) 

str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
io.imshow(coll[10])

這種批量操作對視頻處理是極其有用的,因?yàn)橐曨l就是一系列的圖片組合

from skimage import data_dir,io,color
class AVILoader: 
        video_file = 'myvideo.avi' 
        def __call__(self, frame): 
                return video_read(self.video_file, frame)
avi_load = AVILoader()

frames = range(0, 1000, 10) # 0, 10, 20, ...ic =io.ImageCollection(frames, load_func=avi_load)

這段代碼的意思盒音,就是將myvideo.avi這個視頻中每隔10幀的圖片讀取出來表鳍,放在圖片集合中馅而。
得到圖片集合以后,我們還可以將這些圖片連接起來进胯,構(gòu)成一個維度更高的數(shù)組用爪,連接圖片的函數(shù)為:

skimage.io.concatenate_images(ic)

帶一個參數(shù),就是以上的圖片集合胁镐,如:

from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
mat=io.concatenate_images(coll)

使用concatenate_images(ic)函數(shù)的前提是讀取的這些圖片尺寸必須一致偎血,否則會出錯。我們看看圖片連接前后的維度變化:

from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
print(len(coll)) #連接的圖片數(shù)量
print(coll[0].shape) #連接前的圖片尺寸盯漂,所有的都一樣
mat=io.concatenate_images(coll)
print(mat.shape) #連接后的數(shù)組尺寸

顯示結(jié)果:

2
(870, 580, 3)
(2, 870, 580, 3)

可以看到颇玷,將2個3維數(shù)組,連接成了一個4維數(shù)組
如果我們對圖片進(jìn)行批量操作后就缆,想把操作后的結(jié)果保存起來帖渠,也是可以辦到的。
例:把系統(tǒng)自帶的所有png示例圖片竭宰,全部轉(zhuǎn)換成256256的jpg格式灰度圖空郊,保存在d:/data/文件夾下*
改變圖片的大小,我們可以使用tranform模塊的resize()函數(shù)切揭,后續(xù)會講到這個模塊制跟。

from skimage import data_dir,io,transform,color
import numpy as np
def convert_gray(f):
        rgb=io.imread(f) #依次讀取rgb圖片 
        gray=color.rgb2gray(rgb) #將rgb圖片轉(zhuǎn)換成灰度圖 
        dst=transform.resize(gray,(256,256)) #將灰度圖片大小轉(zhuǎn)換為256*256 
        return dst str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
for i in range(len(coll)): 
    io.imsave('d:/data/'+np.str(i)+'.jpg',coll[i]) #循環(huán)保存圖片

結(jié)果:



圖像的形變與縮放

圖像的形變與縮放棒厘,使用的是skimage的transform模塊,函數(shù)比較多,功能齊全狰右。
1听怕、改變圖片尺寸resize
函數(shù)格式為:

skimage.transform.resize(image, output_shape)

image: 需要改變尺寸的圖片
output_shape: 新的圖片尺寸

from skimage import transform,data
import matplotlib.pyplot as plt
img = data.camera()
dst=transform.resize(img, (80, 60))
plt.figure('resize')
plt.subplot(121)
plt.title('before resize')
plt.imshow(img,plt.cm.gray)
plt.subplot(122)
plt.title('before resize')
plt.imshow(dst,plt.cm.gray)
plt.show()

將camera圖片由原來的512x512大小废封,變成了80x60大小辛辨。從下圖中的坐標(biāo)尺,我們能夠看出來:


2励背、按比例縮放rescale
函數(shù)格式為:

skimage.transform.rescale(image, scale[, ...])

scale參數(shù)可以是單個float數(shù)春霍,表示縮放的倍數(shù),也可以是一個float型的tuple叶眉,如[0.2,0.5],表示將行列數(shù)分開進(jìn)行縮放

from skimage import transform,data
img = data.camera()
print(img.shape) #圖片原始大小 
print(transform.rescale(img, 0.1).shape) #縮小為原來圖片大小的0.1
print(transform.rescale(img, [0.5,0.25]).shape) #縮小為原來圖片行數(shù)一半终畅,列數(shù)四分之一
print(transform.rescale(img, 2).shape) #放大為原來圖片大小的2倍

結(jié)果為:

(512, 512)
(51, 51)
(256, 128)
(1024, 1024)

3、旋轉(zhuǎn) rotate

skimage.transform.rotate(image, angle[, ...],resize=False)

angle參數(shù)是個float類型數(shù)竟闪,表示旋轉(zhuǎn)的度數(shù)
resize用于控制在旋轉(zhuǎn)時离福,是否改變大小 ,默認(rèn)為False

from skimage import transform,data
import matplotlib.pyplot as plt
img = data.camera()
print(img.shape) #圖片原始大小
img1=transform.rotate(img, 60) #旋轉(zhuǎn)90度炼蛤,不改變大小 
print(img1.shape)
img2=transform.rotate(img, 30,resize=True) #旋轉(zhuǎn)30度妖爷,同時改變大小
print(img2.shape) plt.figure('resize')
plt.subplot(121)plt.title('rotate 60')
plt.imshow(img1,plt.cm.gray)
plt.subplot(122)
plt.title('rotate 30')
plt.imshow(img2,plt.cm.gray)
plt.show()

顯示結(jié)果:



4、圖像金字塔
以多分辨率來解釋圖像的一種有效但概念簡單的結(jié)構(gòu)就是圖像金字塔。圖像金字塔最初用于機(jī)器視覺和圖像壓縮絮识,一幅圖像的金字塔是一系列以金字塔形狀排列的分辨率逐步降低的圖像集合绿聘。金字塔的底部是待處理圖像的高分辨率表示,而頂部是低分辨率的近似次舌。當(dāng)向金字塔的上層移動時熄攘,尺寸和分辨率就降低。
在此彼念,我們舉一個高斯金字塔的應(yīng)用實(shí)例挪圾,函數(shù)原型為:

skimage.transform.pyramid_gaussian(image, downscale=2)

downscale控制著金字塔的縮放比例

import numpy as np
import matplotlib.pyplot as plt
from skimage import data,transform
image = data.astronaut() #載入宇航員圖片
rows, cols, dim = image.shape #獲取圖片的行數(shù),列數(shù)和通道數(shù)
pyramid = tuple(transform.pyramid_gaussian(image, downscale=2)) #產(chǎn)生高斯金字塔圖像#共生成了log(512)=9幅金字塔圖像逐沙,加上原始圖像共10幅哲思,pyramid[0]-pyramid[1]
composite_image = np.ones((rows, cols + cols / 2, 3), dtype=np.double) #生成背景composite_image[:rows, :cols, :] = pyramid[0] #融合原始圖像
i_row = 0
for p in pyramid[1:]: 
       n_rows, n_cols = p.shape[:2] 
       composite_image[i_row:i_row + n_rows, cols:cols + n_cols] = p #循環(huán)融合9幅金字塔圖像
       i_row += n_rows

plt.imshow(composite_image)
plt.show()

上右圖,就是10張金字塔圖像吩案,下標(biāo)為0的表示原始圖像棚赔,后面每層的圖像行和列變?yōu)樯弦粚拥囊话耄敝磷優(yōu)?
除了高斯金字塔外徘郭,還有其它的金字塔靠益,如:

skimage.transform.pyramid_laplacian(image, downscale=2)

對比度與亮度調(diào)整

圖像亮度與對比度的調(diào)整,是放在skimage包的exposure模塊里面
1残揉、gamma調(diào)整
原理:I=Ig

對原圖像的像素捆毫,進(jìn)行冪運(yùn)算,得到新的像素值冲甘。公式中的g就是gamma值。
如果gamma>1, 新圖像比原圖像暗
如果gamma<1,新圖像比原圖像亮
函數(shù)格式為:

skimage.exposure.adjust_gamma(image, gamma=1)

gamma參數(shù)默認(rèn)為1途样,原像不發(fā)生變化 江醇。

from skimage import data, exposure, img_as_float
import matplotlib.pyplot as plt
image = img_as_float(data.moon())
gam1= exposure.adjust_gamma(image, 2) #調(diào)暗
gam2= exposure.adjust_gamma(image, 0.5) #調(diào)亮plt.figure('adjust_gamma',figsize=(8,8))
plt.subplot(131)plt.title('origin image')
plt.imshow(image,plt.cm.gray)plt.axis('off')
plt.subplot(132)
plt.title('gamma=2')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
plt.subplot(133)
plt.title('gamma=0.5')
plt.imshow(gam2,plt.cm.gray)
plt.axis('off')
plt.show()

2、log對數(shù)調(diào)整
這個剛好和gamma相反
原理:I=log(I)

from skimage import data, exposure, img_as_float
import matplotlib.pyplot as plt
image = img_as_float(data.moon())
gam1= exposure.adjust_log(image) #對數(shù)調(diào)整
plt.figure('adjust_gamma',figsize=(8,8))
plt.subplot(121)plt.title('origin image')
plt.imshow(image,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('log')
plt.imshow(gam1,plt.cm.gray)
plt.axis('off')
plt.show()

3何暇、判斷圖像對比度是否偏低
函數(shù):is_low_contrast(img)
返回一個bool型值

from skimage import data, exposure
image =data.moon()
result=exposure.is_low_contrast(image)
print(result)

輸出為False

4陶夜、調(diào)整強(qiáng)度
函數(shù):

skimage.exposure.rescale_intensity(image, in_range='image', out_range='dtype')

in_range 表示輸入圖片的強(qiáng)度范圍,默認(rèn)為'image', 表示用圖像的最大/最小像素值作為范圍
out_range 表示輸出圖片的強(qiáng)度范圍裆站,默認(rèn)為'dype', 表示用圖像的類型的最大/最小值作為范圍
默認(rèn)情況下条辟,輸入圖片的[min,max]范圍被拉伸到[dtype.min, dtype.max],如果dtype=uint8, 那么dtype.min=0, dtype.max=255

import numpy as np
from skimage import exposure
image = np.array([51, 102, 153], dtype=np.uint8)
mat=exposure.rescale_intensity(image)
print(mat)

輸出為[ 0 127 255]
即像素最小值由51變?yōu)?宏胯,最大值由153變?yōu)?55羽嫡,整體進(jìn)行了拉伸,但是數(shù)據(jù)類型沒有變肩袍,還是uint8
前面我們講過杭棵,可以通過img_as_float()函數(shù)將unit8類型轉(zhuǎn)換為float型,實(shí)際上還有更簡單的方法氛赐,就是乘以1.0

import numpy as np
image = np.array([51, 102, 153], dtype=np.uint8)
print(image*1.0)

即由[51,102,153]變成了[ 51. 102. 153.]
float類型的范圍是[0,1]魂爪,因此對float進(jìn)行rescale_intensity 調(diào)整后先舷,范圍變?yōu)閇0,1],而不是[0,255]

import numpy as np
from skimage import exposure
image = np.array([51, 102, 153], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp)
print(mat)

結(jié)果為[ 0. 0.5 1. ]
如果原始像素值不想被拉伸,只是等比例縮小滓侍,就使用in_range參數(shù)蒋川,如:

import numpy as np
from skimage import exposure
image = np.array([51, 102, 153], dtype=np.uint8)
tmp=image*1.0
mat=exposure.rescale_intensity(tmp,in_range=(0,255))
print(mat)

輸出為:[ 0.2 0.4 0.6],即原像素值除以255
如果參數(shù)in_range的[main,max]范圍要比原始像素值的范圍[min,max] 大或者小撩笆,那就進(jìn)行裁剪捺球,如:

mat=exposure.rescale_intensity(tmp,in_range=(0,102))
print(mat)

輸出[ 0.5 1. 1. ],即原像素值除以102浇衬,超出1的變?yōu)?
如果一個數(shù)組里面有負(fù)數(shù)懒构,現(xiàn)在想調(diào)整到正數(shù),就使用out_range參數(shù)耘擂。如:

import numpy as np
from skimage import exposure
image = np.array([-10, 0, 10], dtype=np.int8)
mat=exposure.rescale_intensity(image, out_range=(0, 127))
print(mat)

輸出[ 0 63 127]


直方圖與均衡化

在圖像處理中胆剧,直方圖是非常重要,也是非常有用的一個處理要素醉冤。
在skimage庫中對直方圖的處理秩霍,是放在exposure這個模塊中。
1蚁阳、計(jì)算直方圖
函數(shù):

skimage.exposure.histogram(image, nbins=256)

在numpy包中铃绒,也提供了一個計(jì)算直方圖的函數(shù)histogram(),兩者大同小義。
返回一個tuple(hist, bins_center), 前一個數(shù)組是直方圖的統(tǒng)計(jì)量螺捐,后一個數(shù)組是每個bin的中間值

import numpy as np
from skimage import exposure,data
image =data.camera()*1.0
hist1=np.histogram(image, bins=2) #用numpy包計(jì)算直方圖hist2=exposure.histogram(image, nbins=2) #用skimage計(jì)算直方圖
print(hist1)
print(hist2)

輸出:

(array([107432, 154712], dtype=int64), array([ 0. , 127.5, 255. ]))
(array([107432, 154712], dtype=int64), array([ 63.75, 191.25]))

分成兩個bin颠悬,每個bin的統(tǒng)計(jì)量是一樣的,但numpy返回的是每個bin的兩端的范圍值定血,而skimage返回的是每個bin的中間值

2赔癌、繪制直方圖
繪圖都可以調(diào)用matplotlib.pyplot庫來進(jìn)行,其中的hist函數(shù)可以直接繪制直方圖澜沟。
調(diào)用方式:

n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1灾票,histtype='bar')

hist的參數(shù)非常多,但常用的就這六個茫虽,只有第一個是必須的刊苍,后面四個可選

arr: 需要計(jì)算直方圖的一維數(shù)組
bins: 直方圖的柱數(shù),可選項(xiàng)濒析,默認(rèn)為10
normed: 是否將得到的直方圖向量歸一化正什。默認(rèn)為0
facecolor: 直方圖顏色
edgecolor: 直方圖邊框顏色
alpha: 透明度
histtype: 直方圖類型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’

返回值 :

n: 直方圖向量号杏,是否歸一化由參數(shù)normed設(shè)定
bins: 返回各個bin的區(qū)間范圍
patches: 返回每個bin里面包含的數(shù)據(jù)埠忘,是一個list
from skimage import data
import matplotlib.pyplot as plt
img=data.camera()
plt.figure("hist")
arr=img.flatten()
n, bins, patches = plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') 
plt.show()

其中的flatten()函數(shù)是numpy包里面的,用于將二維數(shù)組序列化成一維數(shù)組。
是按行序列莹妒,如

mat=[[1 2 3
     4 5 6]]

經(jīng)過 mat.flatten()后名船,就變成了

mat=[1 2 3 4 5 6]

3、彩色圖片三通道直方圖

一般來說直方圖都是征對灰度圖的旨怠,如果要畫rgb圖像的三通道直方圖渠驼,實(shí)際上就是三個直方圖的疊加。

from skimage import data
import matplotlib.pyplot as plt
img=data.lena()
ar=img[:,:,0].flatten()
plt.hist(ar, bins=256, normed=1,facecolor='r',edgecolor='r',hold=1)
ag=img[:,:,1].flatten()
plt.hist(ag, bins=256, normed=1, facecolor='g',edgecolor='g',hold=1)
ab=img[:,:,2].flatten()
plt.hist(ab, bins=256, normed=1, facecolor='b',edgecolor='b')
plt.show()

其中鉴腻,加一個參數(shù)hold=1,表示可以疊加


4迷扇、直方圖均衡化

如果一副圖像的像素占有很多的灰度級而且分布均勻,那么這樣的圖像往往有高對比度和多變的灰度色調(diào)爽哎。直方圖均衡化就是一種能僅靠輸入圖像直方圖信息自動達(dá)到這種效果的變換函數(shù)蜓席。它的基本思想是對圖像中像素個數(shù)多的灰度級進(jìn)行展寬,而對圖像中像素個數(shù)少的灰度進(jìn)行壓縮课锌,從而擴(kuò)展取值的動態(tài)范圍厨内,提高了對比度和灰度色調(diào)的變化,使圖像更加清晰渺贤。

from skimage import data,exposure
import matplotlib.pyplot as plt
img=data.moon()
plt.figure("hist",figsize=(8,8))
arr=img.flatten()
plt.subplot(221)
plt.imshow(img,plt.cm.gray) #原始圖像
plt.subplot(222)
plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') #原始圖像直方圖
img1=exposure.equalize_hist(img)
arr1=img1.flatten()
plt.subplot(223)
plt.imshow(img1,plt.cm.gray) #均衡化圖像
plt.subplot(224)
plt.hist(arr1, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()

CLAHE

skimage.exposure.``equalize_adapthist(image, kernel_size=None, clip_limit=0.01, nbins=256)

Contrast Limited Adaptive Histogram Equalization (CLAHE).

An algorithm for local contrast enhancement, that uses histograms computed over different tile regions of the image. Local details can therefore be enhanced even in regions that are darker or lighter than most of the image.

image : (M, N[, C]) ndarray

Input image.
kernel_size: integer or list-like, optional
Defines the shape of contextual regions used in the algorithm. If iterable is passed, it must have the same number of elements as image.ndim (without color channel). If integer, it is broadcasted to each image dimension. By default, kernel_size is 1/8 of image height by 1/8 of its width.

clip_limit : float, optional

Clipping limit, normalized between 0 and 1 (higher values give more contrast).
nbins : int, optional
Number of gray bins for histogram (“data range”).

| Returns: |

out : (M, N[, C]) ndarray

Equalized image.

http://scikit-image.org/docs/dev/api/skimage.exposure.html#equalize-adapthist

from skimage import data,exposure
import matplotlib.pyplot as plt
#%matplotlib notebook
clip_limitnumber=0.01
img=data.moon()
print(img.shape)
plt.figure("hist",figsize=(8,8))
arr=img.flatten()
plt.subplot(5,2,1)
plt.title('original')
plt.imshow(img,plt.cm.gray) #原始圖像
plt.subplot(5,2,2)
plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') #原始圖像直方圖
# #img1=exposure.equalize_hist(img)
# img1=exposure.equalize_hist(img)
# arr1=img1.flatten()
# plt.subplot(6,2,3)
# plt.title('equalize_hist')
# plt.imshow(img1,plt.cm.gray) #均衡化圖像
# plt.subplot(6,2,4)
# plt.hist(arr1, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
# plt.show()
img2=exposure.equalize_adapthist(img, kernel_size=256, clip_limit=clip_limitnumber, nbins=256)
arr2=img2.flatten()
plt.subplot(5,2,3)
plt.title('equalize_adapthist-256-'+ str(clip_limitnumber))
plt.imshow(img2,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,4)
plt.hist(arr2, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
img3=exposure.equalize_adapthist(img, kernel_size=128, clip_limit=clip_limitnumber, nbins=256)
arr3=img3.flatten()
plt.subplot(5,2,5)
plt.title('equalize_adapthist-128-'+ str(clip_limitnumber))
plt.imshow(img3,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,6)
plt.hist(arr3, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
img4=exposure.equalize_adapthist(img, kernel_size=64, clip_limit=clip_limitnumber, nbins=256)
arr4=img4.flatten()
plt.subplot(5,2,7)
plt.title('equalize_adapthist-64-'+ str(clip_limitnumber))
plt.imshow(img4,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,8)
plt.hist(arr4, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
img5=exposure.equalize_adapthist(img, kernel_size=32, clip_limit=clip_limitnumber, nbins=256)
arr5=img5.flatten()
plt.subplot(5,2,9)
plt.title('equalize_adapthist-32-'+ str(clip_limitnumber))
plt.imshow(img5,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,10)
plt.hist(arr5, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
1.png
from skimage import data,exposure
import matplotlib.pyplot as plt
#%matplotlib notebook
kernel_sizenuber=64
img=data.moon()
print(img.shape)
plt.figure("hist",figsize=(8,8))
arr=img.flatten()
plt.subplot(5,2,1)
plt.title('original')
plt.imshow(img,plt.cm.gray) #原始圖像
plt.subplot(5,2,2)
plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') #原始圖像直方圖
# #img1=exposure.equalize_hist(img)
# img1=exposure.equalize_hist(img)
# arr1=img1.flatten()
# plt.subplot(6,2,3)
# plt.title('equalize_hist')
# plt.imshow(img1,plt.cm.gray) #均衡化圖像
# plt.subplot(6,2,4)
# plt.hist(arr1, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
# plt.show()
img2=exposure.equalize_adapthist(img, kernel_size=kernel_sizenuber, clip_limit=0.001, nbins=256)
arr2=img2.flatten()
plt.subplot(5,2,3)
plt.title('equalize_adapthist-'+ str(kernel_sizenuber)+'-0.001')
plt.imshow(img2,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,4)
plt.hist(arr2, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
img3=exposure.equalize_adapthist(img, kernel_size=kernel_sizenuber, clip_limit=0.005, nbins=256)
arr3=img3.flatten()
plt.subplot(5,2,5)
plt.title('equalize_adapthist-'+ str(kernel_sizenuber)+'-0.005')
plt.imshow(img3,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,6)
plt.hist(arr3, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
img4=exposure.equalize_adapthist(img, kernel_size=kernel_sizenuber, clip_limit=0.01, nbins=256)
arr4=img4.flatten()
plt.subplot(5,2,7)
plt.title('equalize_adapthist-'+ str(kernel_sizenuber)+'-0.01')
plt.imshow(img4,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,8)
plt.hist(arr4, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()
img5=exposure.equalize_adapthist(img, kernel_size=kernel_sizenuber, clip_limit=0.05, nbins=256)
arr5=img5.flatten()
plt.subplot(5,2,9)
plt.title('equalize_adapthist-'+ str(kernel_sizenuber)+'-0.05')
plt.imshow(img5,plt.cm.gray) #均衡化圖像
plt.subplot(5,2,10)
plt.hist(arr5, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
plt.show()

2.png

參考文獻(xiàn)
python數(shù)字圖像處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雏胃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子志鞍,更是在濱河造成了極大的恐慌瞭亮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件固棚,死亡現(xiàn)場離奇詭異统翩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)此洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門厂汗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黍翎,你說我怎么就攤上這事⊙薮裕” “怎么了匣掸?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氮双。 經(jīng)常有香客問我碰酝,道長,這世上最難降的妖魔是什么戴差? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任送爸,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袭厂。我一直安慰自己墨吓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布纹磺。 她就那樣靜靜地躺著帖烘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橄杨。 梳的紋絲不亂的頭發(fā)上秘症,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機(jī)與錄音式矫,去河邊找鬼乡摹。 笑死,一個胖子當(dāng)著我的面吹牛采转,可吹牛的內(nèi)容都是我干的聪廉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氏义,長吁一口氣:“原來是場噩夢啊……” “哼锄列!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惯悠,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤邻邮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后克婶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筒严,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年情萤,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸭蛙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡筋岛,死狀恐怖娶视,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睁宰,我是刑警寧澤肪获,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站柒傻,受9級特大地震影響孝赫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜红符,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一青柄、第九天 我趴在偏房一處隱蔽的房頂上張望伐债。 院中可真熱鬧,春花似錦致开、人聲如沸峰锁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祖今。三九已至,卻和暖如春拣技,著一層夾襖步出監(jiān)牢的瞬間千诬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工膏斤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徐绑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓莫辨,卻偏偏與公主長得像傲茄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沮榜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容