日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像处理与图像识别笔记(五)图像增强2

發布時間:2024/7/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理与图像识别笔记(五)图像增强2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一節中我們講解了灰度變換的原理以及實現方法,本節我們講解空域濾波增強,與灰度變換相同,空域濾波增強是一種空域處理的方法,不過空域濾波不是一種對點做處理的方法,而是利用相鄰像素間的關系進行增強。空域濾波可以按照增強效果的不同分為平滑銳化兩類,又都可分為線性與非線性方法,線性濾波利用空域卷積來實現。接下來我們對平滑與銳化一一進行講解。

一、圖像平滑

圖像平滑的目的是抑制和消除噪聲,我們首先介紹一種線性平滑方法—鄰域平均,平滑算子為

AAA表示已以(i,j)(i,j)(i,j)為中心的鄰域點的集合,MMMAAA中像素點的總數,鄰域平均的實現代碼如下:

import cv2 import numpy as np import matplotlib.pyplot as plt import pylabimg = cv2.imread('Lena.jpg',1) kernel = np.ones((5,5),np.float32)/25 #5×5卷積核,鄰域平均 res = cv2.filter2D(img,-1,kernel) cv2.imshow('res',res) cv2.waitKey(0)

opencv提供cv2.filter2D()函數來對圖像進行卷積操作

dst = cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) #dst:輸出圖像 #src:輸入圖像 #ddepth:輸出圖像深度,-1為與原圖相同 #kernel:卷積核 #anchor:錨點,默認為(-1, -1),指卷積核的中心點 #delta:輸出結果時的附加值,默認為0 #borderType:邊界模式,默認為BORDER_DEFAULT

我們采用不同大小的卷積核,依次對源圖像進行卷積操作,結果如下,

卷積核半徑越大,圖像平滑的效果越明顯,圖像越來越模糊。
除了上述線性平滑方法之外,還有非線性平滑濾波器,包括中值濾波百分比濾波最大值濾波最小值濾波,我們特別講解一下中值濾波,中值濾波是將選定的奇數像素窗口內的各像素灰度按大小排隊,用中間的灰度值代替窗口中原圖像中間位置的像素,因此是一種非線性濾波。中值濾波對既保留邊緣又要求去噪的任務很有用,尤其對椒鹽噪聲
我們為Lena添加椒鹽噪聲,分別對其進行鄰域平均與中值濾波,實現代碼如下,

import cv2 import numpy as np import matplotlib.pyplot as plt import random import pylabdef cvToplt(img): #經過顏色轉換后plt才能輸出彩色圖像b,g,r = cv2.split(img) img = cv2.merge([r,g,b])return img def main(): img = cv2.imread('Lena.jpg',1)x,y,z = img.shapefor i in range(5000): #添加椒鹽噪聲row = random.randint(0,x-1)col = random.randint(0,y-1)img[row][col] = 255kernel = np.ones((5,5),np.float32)/25res = cv2.filter2D(img,-1,kernel) #鄰域平均res2= cv2.medianBlur(img,5) #中值濾波plt.subplot('131'),plt.imshow(cvToplt(img)),plt.title('Original')plt.subplot('132'),plt.imshow(cvToplt(res)),plt.title('mean')plt.subplot('133'),plt.imshow(cvToplt(res2)),plt.title('median')pylab.show()if __name__ =="__main__":main()

結果如下,

經過對比發現,中值濾波的去噪效果好,且能夠較好的保留圖像邊緣,鄰域平均的平滑效果更好但去噪效果相對較差

二、圖像銳化

對正常的圖像,通過銳化提取邊緣、輪廓、線條等信息,供進一步識別。通過加重圖像輪廓克服降質,以達到更好的視覺效果。常見的銳化算法包括Roberts算子Sobel算子、Prewitt算子、拉普拉斯算子

(1)基于一階微分的圖像增強—梯度法
我們把圖像看成二維離散函數,為了提取圖像的邊緣,我們需要計算圖像的梯度,梯度是方向導數取最大值的方向的向量 ,圖像的邊緣即為圖像梯度較大的地方
梯度用一個二維列向量來定義,

????????????????

對于離散的二維圖像,為計算方便,用絕對值代替幅值,用差分代替微分:
(1)(1)1
為了更好的理解,我們考慮一個3×3的圖像區域,

zzz代表灰度級,由式(1)(1)1,在點z5z_5z5?▽f=∣z6?z5∣+∣z8?z5∣▽f=|z_6-z_5|+|z_8-z_5|f=z6??z5?+z8??z5?

接下來我們來看Roberts交叉梯度,z5z_5z5?▽f=∣z9?z5∣+∣z8?z6∣▽f=|z_9-z_5|+|z_8-z_6|f=z9??z5?+z8??z6?,我們發現計算方法發生了改變,可以理解為各種梯度算子就是不同的梯度計算方法,由于上述的梯度公式本來就是近似的,因此沒有絕對的衡量方法,每種梯度算子的功效各不相同,像第一種方式關注的是圖像水平方向和垂直方向上的梯度,而Roberts交叉梯度則關注的是斜對角方向上的梯度
Roberts交叉梯度的計算由兩個模板組成,第一個模板求得梯度的第一項,第二個模板求得梯度的第二項,然后求和,得到梯度。兩個模板稱為Roberts交叉梯度算子。

利用Roberts交叉梯度算子對圖像進行處理,實現代碼如下,

import cv2 import numpy as np import matplotlib.pyplot as plt import pylabdef main():img = cv2.imread('Lena.jpg',0)plt.imshow(img,'gray')kernel_1 = np.array([[-1,0],[0,1]]) #Roberts算子kernel_2 = np.array([[0,-1],[1,0]])res = cv2.filter2D(img,-1,kernel_1)res2 = cv2.filter2D(img,-1,kernel_2)plt.subplot(131),plt.imshow(res,'gray'),plt.title('1')plt.subplot(132),plt.imshow(res2,'gray'),plt.title('2')plt.subplot(133),plt.imshow(res+res2,'gray'),plt.title('1+2')pylab.show()if __name__ == "__main__":main()

實驗結果如下,

接下來我們學習Sobel梯度算子,Sobel是一種3×3的梯度模板,▽f=∣(z7+2z8+z9)?(z1+2z2+z3)∣+∣(z3+2z6+z9)?(z1+2z4+z7)∣▽f=|(z_7+2z_8+z_9)-(z_1+2z_2+z_3)|+|(z_3+2z_6+z_9)-(z_1+2z_4+z_7)|f=(z7?+2z8?+z9?)?(z1?+2z2?+z3?)+(z3?+2z6?+z9?)?(z1?+2z4?+z7?)

Sobel關注的是水平方向上與垂直方向上的梯度,這點與Roberts不同,Sobel實現代碼如下,

import cv2 import numpy as np import matplotlib.pyplot as plt import pylabdef main():img = cv2.imread('Lena.jpg',0)kernel_1 = np.array([[-1,-2,-1],[0,0,0],[1,2,1]]) #Sobel算子kernel_2 = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])res = cv2.filter2D(img,-1,kernel_1)res2 = cv2.filter2D(img,-1,kernel_2)plt.subplot(131),plt.imshow(res,'gray'),plt.title('1')plt.subplot(132),plt.imshow(res2,'gray'),plt.title('2')plt.subplot(133),plt.imshow(res+res2,'gray'),plt.title('1+2')pylab.show()if __name__ == "__main__":main()

實驗結果如下,

(2)基于二階微分的圖像增強—拉普拉斯算子
對圖像求二階微分(近似),

xxx方向上,

yyy方向上,

則二階微分為
▽2f=[f(x+1,y)+f(x?1,y)+f(x,y+1)+f(x,y?1)]?4f(x,y)▽^2f = [f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)2f=[f(x+1,y)+f(x?1,y)+f(x,y+1)+f(x,y?1)]?4f(x,y)
拉普拉斯算子模板為

由于拉普拉斯是一種微分算子,它的應用可增強圖像中灰度突變的區域,減弱灰度的緩慢變化區域
我們通常的做法是把原圖像和拉普拉斯圖像疊加在一起,這樣既能保護拉式銳化效果,同時又能復原背景信息,具體的做法是:

當然,上述過程也可一步完成,更改拉普拉斯模板即可,如下(注意,此處模板中心只能為正,在以后的應用中,模板中心最好設為正值),

拉普拉斯算子實現代碼如下,

import cv2 import numpy as np import matplotlib.pyplot as plt import pylabdef main():img = cv2.imread('Lena.jpg',0)kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]]) #拉普拉斯算子res = cv2.filter2D(img,-1,kernel)plt.subplot(121),plt.imshow(img,'gray'),plt.title('1')plt.subplot(122),plt.imshow(res,'gray'),plt.title('2')pylab.show()if __name__ == "__main__":main()

實驗結果如下,

總結一下,我們詳細講解了三種算子,Roberts算子、Sobel算子和拉式算子,前兩種屬于一階算子,拉式算子屬于二階算子。通常我們在處理圖像時,先會用拉式算子突出圖像中的小細節,后用梯度法突出圖像的邊緣

本節我們所講屬于圖像增強技術中的空域濾波技術,即利用各種各樣的模板(算子)對圖像進行處理,后邊我們會講到基于頻域的圖像處理技術。

未完待續

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的图像处理与图像识别笔记(五)图像增强2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。