python全域性灰度線性變換——自由設定影象灰度範圍
阿新 • • 發佈:2018-12-15
全域性線性變換的公式是s = (r-a)*(d-c)/(b-a)+c,其中a、b是原圖片的灰度最小值和最大值,c、d是變換後的灰度值的最小值和最大值。r是當前畫素點的灰度值,s是當前畫素點變換後的灰度值。該公式可自己畫出一個座標,利用相似三角形性質可輕易得出。所以只要我們得到一個圖片的灰度範圍,我們就可以自由變換到指定的灰度範圍,這種灰度變換也是影象增強的一部分。下面的示例能清晰看出變換後的效果。除了圖片的直觀顯示,我們還可以畫出其變換前後的直方圖來看出其差異。
程式碼如下:
import cv2 import matplotlib.pyplot as plt # 統計各灰度值的畫素個數 def histogram(image): (row, col) = image.shape hist = [0]*256 for i in range(row): for j in range(col): hist[image[i,j]] +=1 return hist #全域性灰度線性變換 def global_linear_transmation(img): #將灰度範圍設為0~255 maxV=img.max() minV=img.min() for i in range(img.shape[0]): for j in range(img.shape[1]): img[i,j] = ((img[i,j]-minV)*255)/(maxV-minV) return img image0 = cv2.imread("rice.tif",0) plt.figure() plt.subplot(2,2,1) #使用matplotlib中的imshow顯示影象,注意引數的含義,不加引數試試 plt.imshow(image0,vmin=0, vmax=255,cmap = plt.cm.gray) plt.title('original image') image_hist0 = histogram(image0) plt.subplot(2,2,2) plt.plot(image_hist0) image1=global_linear_transmation(image0) plt.subplot(2,2,3) plt.imshow(image1,vmin=0, vmax=255,cmap = plt.cm.gray) image_hist1 = histogram(image1)#統計變換後圖像的各灰度值畫素的個數 plt.subplot(2,2,4) plt.plot(image_hist1) plt.show()
效果圖如下: