當用均值濾波器降低圖像噪聲的時候,會帶來圖像模糊的副作用。我們當然希望看到的是清晰圖像。那么,清晰圖像和模糊圖像之間的差別在哪里呢?從邏輯上考慮,圖像模糊是因為圖像中物體的輪廓不明顯,輪廓邊緣灰度變化不強烈,層次感不強造成的,那么反過來考慮,輪廓邊緣灰度變化明顯些,層次感強些是不是圖像就更清晰些呢。
那么,這種灰度變化明顯不明顯怎樣去定義呢。我們學過微積分,知道微分就是求函數(shù)的變化率,即導數(shù)(梯度),那么對于圖像來說,可不可以用微分來表示圖像灰度的變化率呢,當然是可以的,前面我們提到過,圖像就是函數(shù)嘛。
在微積分中,一維函數(shù)的一階微分的基本定義是這樣的:
而圖像是一個二維函數(shù)f(x,y),其微分當然就是偏微分。因此有:
因為圖像是一個離散的二維函數(shù),? 不能無限小,我們的圖像是按照像素來離散的,最小的?就是1像素。因此,上面的圖像微分又變成了如下的形式(?=1):
這分別是圖像在(x, y)點處x方向和y方向上的梯度,從上面的表達式可以看出來,圖像的梯度相當于2個相鄰像素之間的差值。
那么,這個梯度(或者說灰度值的變化率)如何增強圖像的清晰度呢?
我們先考慮下x方向,選取某個像素,假設其像素值是100,沿x方向的相鄰像素分別是90,90,90,則根據(jù)上面的計算其x方向梯度分別是10,0,0。這里只取變化率的絕對值,表明變化的大小即可。
我們看到,100和90之間亮度相差10,并不是很明顯,與一大群90的連續(xù)灰度值在一起,輪廓必然是模糊的。我們注意到,如果相鄰像素灰度值有變化,那么梯度就有值,如果相鄰像素灰度值沒有變化,那么梯度就為0。如果我們把梯度值與對應的像素相加,那么灰度值沒有變化的,像素值不變,而有梯度值的,灰度值變大了。
我們看到,相加后的新圖像,原圖像像素點100與90亮度只相差10,現(xiàn)在是110與90,亮度相差20了,對比度顯然增強了,尤其是圖像中物體的輪廓和邊緣,與背景大大加強了區(qū)別,這就是用梯度來增強圖像的原理。
上面只是說了x方向,y方向是一樣的。那么能否將x方向和y方向的梯度結合起來呢?當然是可以的。x方向和y方向上的梯度可以用如下式子表示在一起:
這里又是平方,又是開方的,計算量比較大,于是一般用絕對值來近似平方和平方根的操作,來降低計算量:
我們來計算一下月球圖像的x方向和y方向結合的梯度圖像,以及最后的增強圖像。
import cv2 import numpy as np moon = cv2.imread(“moon.tif”, 0) row, column = moon.shape moon_f = np.copy(moon) moon_f = moon_f.astype(“float”) gradient = np.zeros((row, column)) for x in range(row - 1): for y in range(column - 1): gx = abs(moon_f[x + 1, y] - moon_f[x, y]) gy = abs(moon_f[x, y + 1] - moon_f[x, y]) gradient[x, y] = gx + gy sharp = moon_f + gradient sharp = np.where(sharp 《 0, 0, np.where(sharp 》 255, 255, sharp)) gradient = gradient.astype(“uint8”) sharp = sharp.astype(“uint8”) cv2.imshow(“moon”, moon) cv2.imshow(“gradient”, gradient) cv2.imshow(“sharp”, sharp) cv2.waitKey()
來源:CSDN,作者:saltriver。
原文鏈接:https://blog.csdn.net/saltriver/article/details/78987096
編輯:jq
-
濾波器
+關注
關注
160文章
7710瀏覽量
177513 -
函數(shù)
+關注
關注
3文章
4286瀏覽量
62337
原文標題:圖像梯度的基本原理
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論