skimage例子學習(四)exposure模塊介紹及gamma和log對數調整
小師弟:二師兄,你武藝這麼高強,是怎麼練的啊?不可能是整天的練功房裡呼呼哈嘿吧,那樣就太無趣了吧?
二師兄:其實世上本沒有高手,踩的坑多了,自然就成了高手。小師弟啊,練武也是要講究技巧的,可不能光呼呼哈嘿的傻練,還是要時常總結的。
聽了二師兄的教導,小師弟若有所思……
那麼小師弟做了哪些調整呢?
小師弟決定將函數模塊和例子結合起來練習。
今天是第一彈,會不會有些成效呢?
圖像的亮度和對比度調整,是放在skimage包的exposure模塊裡面,該模塊下主要有以下函數:
本節主要實現了skimage.exposure.adjust_gamma skiamge.exposure.adjust_log skimage.exposure.is_low_contrast。
原理分析
gamma調整
我們認為很多圖像由於光線原因或者曝光率等問題,導致圖像過亮或過暗:因此,我們針對像素I進行冪指處理:
其中,g是gamma參數。
針對上式,有以下兩種情況:
- g>1,得到的圖像比原始圖像暗;
- g<1,得到的圖像比原始圖像亮。
log對數調整
另一種調整方式是採用和指數相反的對數操作進行調整。
其採用的原理是:其中,在skimage中,exposure.adjust_log根據圖像的像素是根據以下方程來計算的:
第二個方式是反對數的計算。
實驗分析
掌握了原理之後,下面我們來實驗看下效果,代碼如下:
定義繪圖函數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_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_cdf
顯示圖片
img = data.moon()#設置gamma值為2,默認為1gamma_corrected = exposure.adjust_gamma(img, 2)#log調整logarithmic_corrected = exposure.adjust_log(img, 1)#顯示結果fig = plt.figure(figsize=(8, 5))axes = np.zeros((2, 3), dtype=np.object)axes[0, 0] = plt.subplot(2, 3, 1, adjustable=box-forced)axes[0, 1] = plt.subplot(2, 3, 2, sharex=axes[0, 0], sharey=axes[0, 0], adjustable=box-forced)axes[0, 2] = plt.subplot(2, 3, 3, sharex=axes[0, 0], sharey=axes[0, 0], adjustable=box-forced)axes[1, 0] = plt.subplot(2, 3, 4)axes[1, 1] = plt.subplot(2, 3, 5)axes[1, 2] = plt.subplot(2, 3, 6)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(gamma_corrected, axes[:, 1])ax_img.set_title(Gamma correction)ax_img, ax_hist, ax_cdf = plot_img_and_hist(logarithmic_corrected, axes[:, 2])ax_img.set_title(Logarithmic correction)ax_cdf.set_ylabel(Fraction of total intensity)ax_cdf.set_yticks(np.linspace(0, 1, 5))fig.tight_layout()plt.show()
判斷圖片對比度是否偏低
from skimage import data, exposureimage =data.moon()result=exposure.is_low_contrast(image)print(result)
如果輸出結果是False,那麼說明圖像的對比度沒有問題。
想看更權威的武功秘籍,還請參閱官方文檔哈
推薦閱讀: