操作環境:windows10系統,spyder3 編輯器,python3語言。
定義:通過對圖像進行各種便函,逐點改變源圖像像素灰度值的相關方法。
目的: 改善畫質。
主要內容:圖像的線性變換與非線性變換,主要為圖像反轉,對數變換等,圖像的直方圖均衡,圖像的二值化處理。
一、圖像反轉
令r為變換前的灰度,s為變換后的灰度,則線性變換的函數:s=a⋅r+bs=a⋅r+b;其中,a為直線的斜率,b為在y軸的截距。選擇不同的a,b值會有不同的效果:
- a>1a>1,增加圖像的對比度
- a<1a<1,減小圖像的對比度
- a=1且b≠0a=1且b≠0,圖像整體的灰度值上移或者下移,也就是圖像整體變亮或者變暗,不會改變圖像的對比度。
- a<0且b=0a<0且b=0,圖像的亮區域變暗,暗區域變亮
- a=1且b=0a=1且b=0,恆定變換,不變
- a=−1且b=255a=−1且b=255,圖像反轉。
在進行圖像增強時,上述的線性變換函數用的較多的就是圖像反轉了,根據上面的參數,圖像反轉的變換函數為:s=255−ss=255−s。圖像反轉得到的是圖像的負片,能夠有效的增強在圖像暗區域的白色或者灰色細節。
以下是“圖像反轉”在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')
二、圖像的對數變換
對數變換的通用公式是:
其中,c是一個常數,底數為,實際計算的時候,需要用換底公式。+1的原因是log的定義域需要>0才有意義。對數變換,將源圖像中范圍較窄的低灰度值映射到范圍較寬的灰度區間,同時將范圍較寬的高灰度值區間映射為較窄的灰度區間,從而擴展了暗像素的值,壓縮了高灰度的值,能夠對圖像中低灰度細節進行增強。
以下是圖像對數變換在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 ## 圖像的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
https://www.cnblogs.com/wangguchangqing/p/6983680.html
https://www.jb51.net/article/139446.htm