skimage例子學習(五)exposure模塊介紹及直方圖均衡化
來自專欄 skimage圖像處理學習
二師兄:小師弟,昨天晚上怎麼沒有在練(shi)功(yan)場(shi)見到你啊?
小師弟:啊啊啊啊啊啊,二師兄,你看,飛碟……
說時遲那時快,在二師兄轉頭的瞬間,小師弟一溜煙跑沒了,跑去哪裡了呢?當然是繼續打怪升級了,畢竟小師弟這麼好學。(會不會有點心虛啊)
溫故而知新,可以為師矣。還是要想想上次學到了啥?
skimage例子學習(四)exposure模塊介紹及gamma和log對數調整
上節我們說明了exposure模塊中的函數,並對部分函數進行了例子說明。那麼這次等待小師弟的任務會是什麼呢?
這時,第四關的大門打開了,站著一個彪形大漢,舉著一個牌子,上面寫著碩大的幾個字:直方圖均衡化。
這次的主要函數如下:
看來要過這關,必須要完成直方圖均衡化的工作啊。
那麼啥是直方圖均衡化呢?
如果一副圖像的像素佔有很多的灰度級而且分布均勻,那麼這樣的圖像往往有高對比度和多變的灰度色調。
直方圖均衡化就是一種能僅靠輸入圖像直方圖信息自動達到這種效果(得到高對比度的圖像)的變換函數。它的基本思想是對圖像中像素個數多的灰度級進行展寬,而對圖像中像素個數少的灰度進行壓縮,從而擴展取值的動態範圍,提高了對比度和灰度色調的變化,使圖像更加清晰。那麼這個過程就被稱為直方圖均衡化。
而直方圖均衡後的圖像的累計分布函數大致是線性的。
看起來是不是很嚇人,彪形大漢唉,hhh,不過是紙老虎罷了,別忘了,小師弟使用的skimage這個圖像處理庫,可以解決很多問題的。
下面就來詳細解說下小師弟的通關過程:
def plot_img_and_hist(image, axes, bins=256): image = img_as_float(image) ax_img, ax_hist = axes ax_cdf = ax_hist.twinx() # 顯示圖片 ax_img.imshow(image, cmap=plt.cm.gray) ax_img.set_axis_off() ax_img.set_adjustable(box-forced) # 顯示直方圖 ax_hist.hist(image.ravel(), bins=bins, histtype=step, color=black) ax_hist.ticklabel_format(axis=y, style=scientific, scilimits=(0, 0)) ax_hist.set_xlabel(Pixel intensity) ax_hist.set_xlim(0, 1) ax_hist.set_yticks([]) # 顯示累計分布函數 img_cdf, bins = exposure.cumulative_distribution(image, bins) ax_cdf.plot(bins, img_cdf, r) ax_cdf.set_yticks([]) return ax_img, ax_hist, ax_cdfimg = data.moon()# 對比度拉伸p2, p98 = np.percentile(img, (2, 98))img_rescale = exposure.rescale_intensity(img, in_range=(p2, p98))# 直方圖均衡化img_eq = exposure.equalize_hist(img)# 局部對比度增強img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.03)#顯示結果fig = plt.figure(figsize=(8, 5))axes = np.zeros((2, 4), dtype=np.object)axes[0, 0] = fig.add_subplot(2, 4, 1)for i in range(1, 4): axes[0, i] = fig.add_subplot(2, 4, 1+i, sharex=axes[0,0], sharey=axes[0,0])for i in range(0, 4): axes[1, i] = fig.add_subplot(2, 4, 5+i)ax_img, ax_hist, ax_cdf = plot_img_and_hist(img, axes[:, 0])ax_img.set_title(Low contrast image)y_min, y_max = ax_hist.get_ylim()ax_hist.set_ylabel(Number of pixels)ax_hist.set_yticks(np.linspace(0, y_max, 5))#顯示對比度拉伸ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_rescale, axes[:, 1])ax_img.set_title(Contrast stretching)#顯示直方圖均衡化ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_eq, axes[:, 2])ax_img.set_title(Histogram equalization)#顯示局部直方圖均衡化ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_adapteq, axes[:, 3])ax_img.set_title(Adaptive equalization)ax_cdf.set_ylabel(Fraction of total intensity)ax_cdf.set_yticks(np.linspace(0, 1, 5))# 防止y軸溢出fig.tight_layout()plt.show()
這裡小師弟做了很多工作,不僅有直方圖均衡化,還有對比度拉伸、局部對比度增強,為了更形象的表示增強後的圖像,還畫出了累積分布函數。
最後得到的結果如下:
毛主席曾說過,一切反動派都是紙老虎。
小師弟說,對未知事物的恐懼,都是紙老虎。(說得小師弟有點得意了)
「得意啥,還不快趁熱打鐵,繼續往下走」二師兄說著拿平底鍋敲了敲小師弟。
咦,平底鍋不應該是紅太狼的武器嗎,怎麼二師兄也有?難道……(嘿嘿嘿)還是不要亂想了,刷怪方為上策。
嫌小師弟的通關過程太無聊?不怕,這裡還有skimage官方例子
推薦閱讀:
※數字圖像處理基礎:教你如何區分單色圖像、灰度圖像、偽彩色圖像、真彩色圖像
※背景及基本概念介紹
※魔幻光影濾鏡(3):美女人像「劃重點」