操做環境:windows10系統,spyder3 編輯器,python3語言。html
定義:經過對圖像進行各類便函,逐點改變源圖像像素灰度值的相關方法。python
目的: 改善畫質。算法
主要內容:圖像的線性變換與非線性變換,主要爲圖像反轉,對數變換等,圖像的直方圖均衡,圖像的二值化處理。編程
令r爲變換前的灰度,s爲變換後的灰度,則線性變換的函數:s=a⋅r+bs=a⋅r+b;其中,a爲直線的斜率,b爲在y軸的截距。選擇不一樣的a,b值會有不一樣的效果:windows
在進行圖像加強時,上述的線性變換函數用的較多的就是圖像反轉了,根據上面的參數,圖像反轉的變換函數爲:s=255−ss=255−s。圖像反轉獲得的是圖像的負片,可以有效的加強在圖像暗區域的白色或者灰色細節。dom
如下是「圖像反轉」在python3下的實現。(全部代碼直接用須要有能識別中文編碼的定義即# -*- coding: utf-8 -*-)編輯器
1 import matplotlib.pyplot as plt 2 import numpy as np 3 from skimage.util import random_noise 4 from PIL import Image 5
6 img = plt.imread('F:/python編程/本身的博客園代碼/圖像變換/example_gray.jpg') 7 fig = plt.figure(figsize = (8.0,6.0)) 8 ax1 = fig.add_subplot(1,2,1) 9 ## show the original picture
10 ax1.imshow(img) 11 plt.title('original_picture') 12
13 ## 圖像反轉
14 img_reversal = 255- img 15 ax2 = fig.add_subplot(1,2,2) 16 ax2.imshow(img_reversal) 17 plt.title('reversal_picture')
對數變換的通用公式是:ide
其中,c是一個常數,底數爲,實際計算的時候,須要用換底公式。+1的緣由是log的定義域須要>0纔有意義。對數變換,將源圖像中範圍較窄的低灰度值映射到範圍較寬的灰度區間,同時將範圍較寬的高灰度值區間映射爲較窄的灰度區間,從而擴展了暗像素的值,壓縮了高灰度的值,可以對圖像中低灰度細節進行加強。函數
如下是圖像對數變換在python3下的實現。ui
1 #### 圖像的灰度變換
2 import matplotlib.pyplot as plt 3 import numpy as np 4 from skimage.util import random_noise 5 from PIL import Image 6
7 img = plt.imread('F:/python編程/本身的博客園代碼/圖像變換/example_gray.jpg') 8 fig = plt.figure(figsize = (8.0,6.0)) 9 ax1 = fig.add_subplot(1,2,1) 10 ## show the original picture
11 ax1.imshow(img) 12 plt.title('original_picture') 13
14 ## 圖像的log變換
15 img_log = np.log(1 + np.abs(img/255)) #### (0,1)的輸入
16 ax3 = fig.add_subplot(1,2,2) 17 ## show the original picture
18 ax3.imshow(img_log) 19 plt.title('log_picture')
圖像的直方圖——橫座標爲圖像灰度值,縱座標爲在某灰度級下的像素個數。
直方圖均衡技術將原始圖像的灰度直方圖從比較集中的某個灰度區間變成在所有灰度範圍內的均勻分佈, 因爲其算法簡單, 無需藉助外來因素的參數設置,能夠自成系統的運行, 有效地加強圖像對比度, 是一種經常使用的圖像加強方法。
如下是圖像的直方圖均衡在python3下的實現。
1 #### 直方圖均衡
2 from skimage import data,exposure 3 import matplotlib.pyplot as plt 4
5 img = plt.imread('F:/python編程/本身的博客園代碼/圖像變換/example_gray.jpg') 6 plt.figure("hist",figsize=(8,8)) 7
8 arr=img.flatten() 9 plt.subplot(221) 10 plt.imshow(img,plt.cm.gray) #原始圖像
11 plt.subplot(222) 12 plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') #原始圖像直方圖
13
14 img1=exposure.equalize_hist(img) 15 arr1=img1.flatten() 16 plt.subplot(223) 17 plt.imshow(img1,plt.cm.gray) #均衡化圖像
18 plt.subplot(224) 19 plt.hist(arr1, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖
圖像二值化( Image Binarization)就是將圖像上的像素點的灰度值設置爲0或255,也就是將整個圖像呈現出明顯的黑白效果的過程。該過程將256個亮度等級的灰度圖像經過適當的閾值選取而得到仍然能夠反映圖像總體和局部特徵的二值化圖像。
如下是圖像的二值化在python3下的實現。
1 #### 圖像的灰度變換
2 import matplotlib.pyplot as plt 3 import numpy as np 4 from skimage.util import random_noise 5 from PIL import Image 6
7 img = plt.imread('F:/python編程/本身的博客園代碼/圖像變換/example_gray.jpg') 8 fig = plt.figure(figsize = (8.0,6.0)) 9 ax1 = fig.add_subplot(1,2,1) 10 ## show the original picture
11 ax1.imshow(img) 12 plt.title('original_picture') 13
14 ## 二值化
15 img.flags.writeable = True ### 必須加這句否則會報錯,由於圖像開始只是只讀模式
16 threshold = 128
17 H,W,X = img.shape 18 for i in range(X-1): 19 for j in range(H-1): 20 for k in range(W-1): 21 if img[j,k,i] > threshold: 22 img[j,k,i] = 255
23 else: 24 img[j,k,i] = 0 25 img_twovalues = img 26 ax3 = fig.add_subplot(1,2,2) 27 ## show the original picture
28 ax3.imshow(img_twovalues) 29 plt.title('twovalues_picture')
本文參考博文:
https://blog.csdn.net/xuehuitanwan123/article/details/82018051