opencv 图像增强_图像增强、锐化,利用 Python-OpenCV 帮你实现 4 种方法!
圖像增強(qiáng)目的使得模糊圖片變得更加清晰、圖片模糊的原因是因?yàn)橄袼鼗叶炔钪底兓淮?#xff0c;如片各區(qū)域產(chǎn)生視覺(jué)效果似乎都是一樣的, 沒(méi)有較為突出的地方,看起來(lái)不清晰的感覺(jué)
解決這個(gè)問(wèn)題的最直接簡(jiǎn)單辦法,放大像素灰度值差值、使圖像中的細(xì)節(jié)更加清晰。
目前較為常用的幾個(gè)方法:伽馬變換、線性變換、分段線性變換、直方圖均衡化,對(duì)于圖像對(duì)比度增強(qiáng),都能取得不錯(cuò)的效果!
本文將對(duì)每種方法 簡(jiǎn)單介紹一下,并借助于 Python 、OpenCV 進(jìn)行代碼實(shí)現(xiàn),提前說(shuō)一下哈,下面處理的圖像對(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] = 255out = np.around(out)return out這里
設(shè)置為 2 ,變換結(jié)果如下,會(huì)看到強(qiáng)光處出現(xiàn)失真效果(這里對(duì)排列圖片做一下說(shuō)明,從左到右依次為 原圖灰度圖、原圖灰度直方圖、處理之后的灰度圖、處理之后的灰度直方圖,以下的圖片排列方式相同)
2,伽馬變換
伽馬變換對(duì)像素值做的是冪次方變換,主要是圖像的灰度級(jí)發(fā)生改變,轉(zhuǎn)換的原理公式為:
參數(shù)
的設(shè)定 可以參照下面:- 當(dāng) 時(shí),會(huì)減小灰度級(jí)較高的地方,增大灰度級(jí)較低的地方;
- 當(dāng) 時(shí),會(huì)增大灰度級(jí)較高的地方,減小灰度級(jí)較低的地方;
這里 Gamma 分別取 1.5,0.5,結(jié)果如下:
結(jié)果來(lái)看,相對(duì)來(lái)說(shuō)
對(duì)圖像增強(qiáng)的結(jié)果會(huì)更好一點(diǎn)3,分段線性分割
分段線性分割,提前把圖像的灰度級(jí)分為幾部分,然后對(duì)每一部分的像素值做不同的線性變換,像素值基本變換原理:
$$O(x,y) = left{ begin{aligned} a_1* I(x,y) + b_1 & & 0這里寫(xiě)的代碼總感覺(jué)效率特別慢(逐像素改變),知道改進(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] <start:out_img[i][j] = img[i][j]*c1elif img[i][j] < end:out_img[i][j] = img[i][j] *c2 + b2else:out_img[i][j] = img[i][j] * c3 +b3out_img[out_img>255] = 255out = np.around(out_img)out = out.astype(np.uint8)return out函數(shù)中的參數(shù)分別為 50,0.5,150,3.6,-310,0.238,194,結(jié)果如下:
4,直方圖均衡化
每個(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)# 無(wú) Mask,256個(gè)bins,取值范圍為[0,255]hist = cv2.calcHist([img],[0],None,[256],[0,255])return histdef 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]) - 1if q >= 0:output_q[p] = math.floor(q)else:output_q[p] = 0equalhistimage = 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é)果如下,看起來(lái)還是不錯(cuò)的!(這里圖片失真是因?yàn)闊艄獾脑?
小總結(jié)
根據(jù)以上幾個(gè)增強(qiáng)方法來(lái)看,針對(duì)于本案例選取的圖像,線性增強(qiáng)方法相對(duì)效果并不太好,可能會(huì)適用于其它的種類圖像,而 Gamma轉(zhuǎn)換 和直方圖均衡化取得相對(duì)不錯(cuò)的結(jié)果
但圖像增強(qiáng)、銳化沒(méi)有最優(yōu)方法,每種方法都有自己的特點(diǎn),需要根據(jù)自己選擇合適的
最后還是要提醒一下感興趣的小伙伴們,記得跟著敲一下代碼,加深一下應(yīng)用原理!
總結(jié)
以上是生活随笔為你收集整理的opencv 图像增强_图像增强、锐化,利用 Python-OpenCV 帮你实现 4 种方法!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 4路组相连cache设计_Cache组织
- 下一篇: python能做高频交易吗_python