Python灰度變換中的分段線性函數(shù)專項分析實現(xiàn)
1. 分段線性函數(shù)介紹
分段線性函數(shù)同樣是點運算,基于像素的圖像增強,也就是對比度拉伸。
大概的原理就是:將不同灰度區(qū)間的灰度值經(jīng)過不同的映射函數(shù)映射到另一個灰度區(qū)間的過程。

因為使用變換函數(shù)的個數(shù)是三個,所以我們經(jīng)常使用的分段線性函數(shù)是三段線性變換函數(shù)
對應(yīng)的數(shù)學(xué)公式為

- a = 1 ,b = 0 時,恒等函數(shù),不改變圖像的灰度值
- a >1, 對比度增強
- 0 < a < 1 , 對比度減弱
- b 控制圖像的亮度,b > 0 圖像變亮,b < 0 圖像變?nèi)?/li>
對比度:定義為圖像中最高和最低灰度級之間的灰度差
但沒有真正意義上的計算公式,只是大概意思的表示
如果一副圖像灰度的動態(tài)范圍具有高的動態(tài)范圍,那我們就認為這幅圖像的對比度高
2. 代碼實現(xiàn)
import numpy as np
import cv2
def linear_transform(img):
height,width = img.shape[:2]
r1,s1 = 80,10
r2,s2 = 140,200
k1 = s1 / r1 # 第一段斜率
k2 = (s2 - s1) / (r2 - r1) # 第二段斜率
k3 = (255 - s2) / (255 - r2) # 第三段斜率
img_copy = np.zeros_like(img)
for i in range(height):
for j in range(width):
if img[i,j] < r1 :
img_copy[i,j] = k1 * img[i,j]
elif r1 <= img[i,j] <= r2:
img_copy[i,j] = k2 * (img[i,j] - r1) + s1
else:
img_copy[i,j] = k3 * (img[i,j] - r2) + s2
return img_copy
img = cv2.imread('./img.png',0)
ret = linear_transform(img)
cv2.imshow('img',np.hstack((img,ret)))
cv2.waitKey()
cv2.destroyAllWindows()處理結(jié)果為

這里代碼的實現(xiàn)較為簡單,不再贅述,單純的取圖像的像素點然后進行映射而已。
3. other
說說中間兩個分段點怎么取值的問題
因為通過觀察原圖發(fā)現(xiàn),圖像整體灰度值偏低,所以我們將原圖(0-80)的灰度值壓縮到(0-10)范圍內(nèi),再將中間的(80-140) 灰度值放大,就可以將中間的對比度拉大

書上的分段點取得是(r1,s1) = (r.min , 0) , (r2,s2) = (r.max , 255)

只需要將上面的代碼改成這樣,就可以得到下面的圖片

但是這種方法可能不是很泛化,因為觀察這幅圖片的直方圖可以發(fā)現(xiàn),原圖片的低灰度值和高灰度值都是沒有的。而往往大多數(shù)的圖片動態(tài)范圍都是(0,255)。如果按照書上的進行,就會變成
(r1,s1) = (0, 0) , (r2,s2) = (255 , 255),就變成y = x的恒等變換了

最后,因為觀察直方圖,可以知道,在80-90 左右 的左側(cè)像素值均為背景信息,我們可以進行壓縮對比度。而在 90-130 中間灰度占比多,為前景信息,我們可以進行對比度拉伸

上面的分段點就是觀察直方圖得出來得值
- 所以分段線性函數(shù)的分段點可以通過直方圖簡單得到
- 分段線性變換可以不是連續(xù)的
到此這篇關(guān)于Python灰度變換中的分段線性函數(shù)專項分析實現(xiàn)的文章就介紹到這了,更多相關(guān)Python分段線性函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
flask-socketio實現(xiàn)前后端實時通信的功能的示例
本文主要介紹了flask-socketio實現(xiàn)前后端實時通信的功能的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Pytest初學(xué)者快速上手高效Python測試指南
這篇文章主要為大家介紹了Pytest初學(xué)者快速上手的高效Python測試指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Python用for循環(huán)實現(xiàn)九九乘法表
本文通過實例代碼給大家介紹了Python用for循環(huán)實現(xiàn)九九乘法表的方法,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2018-05-05

