matlab图像增强分段线性函数_图像增强、锐化,利用 PythonOpenCV 来实现 4 种方法!...
圖像增強(qiáng)目的使得模糊圖片變得更加清晰、圖片模糊的原因是因?yàn)橄袼鼗叶炔钪底兓淮?#xff0c;圖片各區(qū)域產(chǎn)生視覺效果似乎都是一樣的, 沒有較為突出的地方,看起來不清晰的感覺
解決這個(gè)問題的最直接簡(jiǎn)單辦法,放大像素灰度值差值、使圖像中的細(xì)節(jié)更加清晰。
目前較為常用的幾個(gè)方法:伽馬變換、線性變換、分段線性變換、直方圖均衡化,對(duì)于圖像對(duì)比度增強(qiáng),都能取得不錯(cuò)的效果!
本文將對(duì)每種方法 簡(jiǎn)單介紹一下,并借助于 Python 、OpenCV 進(jìn)行代碼實(shí)現(xiàn),提前說一下哈,下面處理的圖像對(duì)象都是單通道灰度圖,不是三通道彩色圖!
1,線性變換
線性變換的原理是對(duì)所有像素值乘上一個(gè)擴(kuò)張因子 ,像素值大的變得越大,像素值小的變得越小,從而達(dá)到圖像增強(qiáng)的效果,這里利用 Numpy 的數(shù)組進(jìn)行操作;
需要注意的是,像素值最大為255,因此在數(shù)組相乘之后需要進(jìn)行數(shù)值截?cái)嗖僮?#xff0c;最終代碼如下:
def?line_trans_img(img,coffient):????if?len(img.shape)?==?3:
????????img?=?cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
????out?=?2*img
????#像素截?cái)?#xff1b;;;
????out[out>255]?=?255
????out?=?np.around(out)
????return?out
這里 設(shè)置為 2 ,變換結(jié)果如下,會(huì)看到強(qiáng)光處出現(xiàn)失真效果
line.png(這里對(duì)排列圖片做一下說明,從左到右依次為 原圖灰度圖、原圖灰度直方圖、處理之后的灰度圖、處理之后的灰度直方圖,以下的圖片排列方式相同)
2,伽馬變換
伽馬變換對(duì)像素值做的是冪次方變換,主要是圖像的灰度級(jí)發(fā)生改變,轉(zhuǎn)換的原理公式為:
參數(shù) ?的設(shè)定 可以參照下面:
當(dāng)>1 時(shí),會(huì)減小灰度級(jí)較高的地方,增大灰度級(jí)較低的地方;
當(dāng) <1 時(shí),會(huì)增大灰度級(jí)較高的地方,減小灰度級(jí)較低的地方;
????if?len(img.shape)?==?3:
?????????img=?cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
????img?=?255*np.power(img/255,power1)
????img?=?np.around(img)
????img[img>255]?=?255
????out_img?=?img.astype(np.uint8)
????return?out_img
這里 Gamma 分別取 1.5,0.5,結(jié)果如下:
gamma1.5.pnggamma0.5.png結(jié)果來看,相對(duì)來說 ?對(duì)圖像增強(qiáng)的結(jié)果會(huì)更好一點(diǎn)
3,分段線性分割
分段線性分割,提前把圖像的灰度級(jí)分為幾部分,然后對(duì)每一部分的像素值做不同的線性變換,像素值基本變換原理:
這里寫的代碼總感覺效率特別慢(逐像素改變),知道改進(jìn)方法的小伙伴們望告知:
def?seg_augment_img(img,start,c1,end,c2,b2,c3,b3):????if?len(img.shape)?==?3:
?????????img=?cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
????out_img?=?np.zeros(img.shape)
????for?i?in?range(img.shape[0]):
????????for?j?in?range(img.shape[1]):
????????????if?img[i][j]?????????????????out_img[i][j]?=?img[i][j]*c1
????????????elif?img[i][j]?????????????????out_img[i][j]?=?img[i][j]?*c2?+?b2
????????????else:
????????????????out_img[i][j]?=?img[i][j]?*?c3?+b3
????out_img[out_img>255]?=?255
????out?=?np.around(out_img)
????out?=?out.astype(np.uint8)
????return?out
函數(shù)中的參數(shù)分別為 50,0.5,150,3.6,-310,0.238,194,結(jié)果如下:
seg_line.png4,直方圖均衡化
每個(gè)灰度圖像都有自己的灰度直方圖,均衡化的原理是,先根據(jù)灰度直方圖計(jì)算累加灰度直方圖,根據(jù)灰度圖與累加灰度圖的映射關(guān)系關(guān)聯(lián)輸入圖像與輸出圖圖像的映射關(guān)系
映射關(guān)系原理如下:
因此,這里幾個(gè)重要部分:1,計(jì)算出灰度直方圖;2,計(jì)算累加灰度直方圖;3,根據(jù) 1 和 2 得到映射關(guān)系,最終輸出灰度像素值;
def?get_imghist(img):????#?判斷圖像是否為三通道;
????if?len(img.shape)?==?3:
????????img?=?cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
????#?無?Mask,256個(gè)bins,取值范圍為[0,255]
????hist?=?cv2.calcHist([img],[0],None,[256],[0,255])
????return?hist
def?cal_equalhist(img):
????if?len(img.shape)?==?3:
?????????img=?cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
????h,w?=?img.shape[:2]
????grathist?=?get_imghist(img)
????zerosumMoment?=?np.zeros([256],np.uint32)
????for?p?in?range(256):
????????if?p?==0:
????????????zerosumMoment[p]?=?grathist[0]
????????else:
????????????zerosumMoment[p]?=?zerosumMoment[p-1]?+grathist[p]
????output_q?=?np.zeros([256],np.uint8)
????cofficient?=?256.0/(h*w)
????for?p?in?range(256):
????????q?=?cofficient?*float(zerosumMoment[p])?-?1
????????if?q?>=?0:
????????????output_q[p]?=?math.floor(q)
????????else:
????????????output_q[p]?=?0
????equalhistimage?=?np.zeros(img.shape,np.uint8)
????for?i?in?range(h):
????????for?j?in?range(w):
????????????equalhistimage[i][j]?=?output_q[img[i][j]]
????#?第二種方法,opencv 庫(kù)函數(shù)自帶一種:
????#equalhistimage?=?cv2.equalizeHist(img)
????return?equalhistimage
結(jié)果如下,看起來還是不錯(cuò)的!(這里圖片失真是因?yàn)闊艄獾脑?
equalhist.png5,小總結(jié)
根據(jù)以上幾個(gè)增強(qiáng)方法來看,針對(duì)于本案例選取的圖像,線性增強(qiáng)方法相對(duì)效果并不太好,可能會(huì)適用于其它的種類圖像,而 Gamma轉(zhuǎn)換 ?和直方圖均衡化取得相對(duì)不錯(cuò)的結(jié)果
但圖像增強(qiáng)、銳化沒有最優(yōu)方法,每種方法都有自己的特點(diǎn),需要根據(jù)自己選擇合適的
最后還是要提醒一下感興趣的小伙伴們,記得跟著敲一下代碼,加深一下應(yīng)用原理!
推薦閱讀
不用 PS 摳圖,Python + OpenCV ?實(shí)現(xiàn)自動(dòng)海報(bào)場(chǎng)景替換!
用 Python 對(duì)圖片主體輪廓進(jìn)行提取、顏色標(biāo)記、并計(jì)算區(qū)域面積
總結(jié)
以上是生活随笔為你收集整理的matlab图像增强分段线性函数_图像增强、锐化,利用 PythonOpenCV 来实现 4 种方法!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业数据采集的10个经典方法
- 下一篇: python tkinter butto