Python灰度變換中的分段線性函數(shù)專項(xiàng)分析實(shí)現(xiàn)
1. 分段線性函數(shù)介紹
分段線性函數(shù)同樣是點(diǎn)運(yùn)算,基于像素的圖像增強(qiáng),也就是對(duì)比度拉伸。
大概的原理就是:將不同灰度區(qū)間的灰度值經(jīng)過不同的映射函數(shù)映射到另一個(gè)灰度區(qū)間的過程。
因?yàn)槭褂米儞Q函數(shù)的個(gè)數(shù)是三個(gè),所以我們經(jīng)常使用的分段線性函數(shù)是三段線性變換函數(shù)
對(duì)應(yīng)的數(shù)學(xué)公式為
- a = 1 ,b = 0 時(shí),恒等函數(shù),不改變圖像的灰度值
- a >1, 對(duì)比度增強(qiáng)
- 0 < a < 1 , 對(duì)比度減弱
- b 控制圖像的亮度,b > 0 圖像變亮,b < 0 圖像變?nèi)?/li>
對(duì)比度:定義為圖像中最高和最低灰度級(jí)之間的灰度差
但沒有真正意義上的計(jì)算公式,只是大概意思的表示
如果一副圖像灰度的動(dòng)態(tài)范圍具有高的動(dòng)態(tài)范圍,那我們就認(rèn)為這幅圖像的對(duì)比度高
2. 代碼實(shí)現(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é)果為
這里代碼的實(shí)現(xiàn)較為簡(jiǎn)單,不再贅述,單純的取圖像的像素點(diǎn)然后進(jìn)行映射而已。
3. other
說說中間兩個(gè)分段點(diǎn)怎么取值的問題
因?yàn)橥ㄟ^觀察原圖發(fā)現(xiàn),圖像整體灰度值偏低,所以我們將原圖(0-80)的灰度值壓縮到(0-10)范圍內(nèi),再將中間的(80-140) 灰度值放大,就可以將中間的對(duì)比度拉大
書上的分段點(diǎn)取得是(r1,s1) = (r.min , 0) , (r2,s2) = (r.max , 255)
只需要將上面的代碼改成這樣,就可以得到下面的圖片
但是這種方法可能不是很泛化,因?yàn)橛^察這幅圖片的直方圖可以發(fā)現(xiàn),原圖片的低灰度值和高灰度值都是沒有的。而往往大多數(shù)的圖片動(dòng)態(tài)范圍都是(0,255)。如果按照書上的進(jìn)行,就會(huì)變成
(r1,s1) = (0, 0) , (r2,s2) = (255 , 255),就變成y = x的恒等變換了
最后,因?yàn)橛^察直方圖,可以知道,在80-90 左右 的左側(cè)像素值均為背景信息,我們可以進(jìn)行壓縮對(duì)比度。而在 90-130 中間灰度占比多,為前景信息,我們可以進(jìn)行對(duì)比度拉伸
上面的分段點(diǎn)就是觀察直方圖得出來得值
- 所以分段線性函數(shù)的分段點(diǎn)可以通過直方圖簡(jiǎn)單得到
- 分段線性變換可以不是連續(xù)的
到此這篇關(guān)于Python灰度變換中的分段線性函數(shù)專項(xiàng)分析實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python分段線性函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python-pyinstaller、打包后獲取路徑的實(shí)例
今天小編就為大家分享一篇python-pyinstaller、打包后獲取路徑的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信
這篇文章主要介紹了Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信,,需要的朋友可以參考下2015-04-04python+matplotlib實(shí)現(xiàn)動(dòng)態(tài)繪制圖片實(shí)例代碼(交互式繪圖)
這篇文章主要介紹了python+matplotlib實(shí)現(xiàn)動(dòng)態(tài)繪制圖片實(shí)例代碼(交互式繪圖),小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Sentry的安裝、配置、使用教程(Sentry日志手機(jī)系統(tǒng))
Sentry?是一個(gè)實(shí)時(shí)事件日志記錄和聚合平臺(tái),由于ExceptionLess官方提供的客戶端只有.Net/.NetCore平臺(tái)和js的,本文繼續(xù)介紹另一個(gè)日志收集系統(tǒng)Sentry,感興趣的朋友一起看看吧2022-07-07jupyter notebook中新建cell的方法與快捷鍵操作
這篇文章主要介紹了jupyter notebook中新建cell的方法與快捷鍵操作,具有很好的參考價(jià)值,希望對(duì)有所幫助。一起跟隨小編過來看看吧2020-04-04