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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)

發(fā)布時(shí)間:2023/12/10 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 銳化(高通)空間濾波器
      • 使用一階導(dǎo)數(shù)銳化圖像-梯度

銳化(高通)空間濾波器

  • 平滑通過(guò)稱為低通濾波
  • 類(lèi)似于積分運(yùn)算
  • 銳化通常稱為高通濾波
  • 微分運(yùn)算
  • 高過(guò)(負(fù)責(zé)細(xì)節(jié)的)高頻,衰減或抑制低頻

使用一階導(dǎo)數(shù)銳化圖像-梯度

在圖像處理中,一階導(dǎo)數(shù)是用梯度幅度實(shí)現(xiàn)的,圖像的梯度定義為二維列向量
?f≡grad(f)=[gxgy]=[?f/?x?f/?y](3.57)\nabla f \equiv \text{grad}(f) = \begin{bmatrix} g_x \\ g_y \end{bmatrix} = \begin{bmatrix} \partial f /\partial x \\ \partial f /\partial y \ \end{bmatrix} \tag{3.57}?fgrad(f)=[gx?gy??]=[?f/?x?f/?y??](3.57)

向量?f\nabla f?f的幅度表示為M(x,y)M(x, y)M(x,y),也經(jīng)常使用向量范數(shù)∥?f∥\lVert\nabla f \rVert?f
M(x,y)=∥f∥=mag(?f)=gx2+gy2(3.58)M(x, y) = \lVert f \rVert = \text{mag}(\nabla f) = \sqrt{g_x^2 + g_y^2} \tag{3.58}M(x,y)=f=mag(?f)=gx2?+gy2??(3.58)

是梯度向量方向的變化率在(x,y)(x, y)(x,y)處的值,是與原圖像大小相同的圖像,通常稱為梯度圖像

在某些實(shí)現(xiàn)中,使用絕對(duì)值來(lái)近似平方運(yùn)算和平方根運(yùn)算更合適:
M(x,y)≈∣gx∣+∣gy∣(3.59)M(x,y) \approx |g_x| + |g_y| \tag{3.59}M(x,y)gx?+gy?(3.59)

這個(gè)表達(dá)式通常會(huì)損失各向同性。

最簡(jiǎn)近似的一階導(dǎo)數(shù)是gx=(z8?z5)g_x = (z_8 - z_5)gx?=(z8??z5?)gy=(z6?z5)g_y = (z_6 - z_5)gy?=(z6??z5?)

羅伯特交叉梯度算子,早期的圖像處理使用交叉差值

gx=(z9?z5)和gy=(z8?z6)(3.60)g_x = (z_9 - z_5)和g_y = (z_8 - z_6) \tag{3.60}gx?=(z9??z5?)gy?=(z8??z6?)(3.60)
梯度圖像計(jì)算為:
M(x,y)=[(z9?z5)2+(z8?z6)2]1/2(3.61)M(x, y) = \Big[(z_9 - z_5)^2 + (z_8 - z_6)^2 \Big]^{1/2} \tag{3.61}M(x,y)=[(z9??z5?)2+(z8??z6?)2]1/2(3.61)
M(x,y)≈∣z9?z5∣+∣z8?z6∣(3.62)M(x, y) \approx |z_9 - z_5| + |z_8 - z_6| \tag{3.62}M(x,y)z9??z5?+z8??z6?(3.62)

3×33\times 33×3的核
gx=?f/?x=(z7+2z8+z9)?(z1+2z2+z3)(3.63)g_x = \partial f/ \partial x = (z_7 + 2z_8 + z_9) - (z_1 +2z_2 + z_3) \tag{3.63}gx?=?f/?x=(z7?+2z8?+z9?)?(z1?+2z2?+z3?)(3.63)
gy=?f/?y=(z3+2z6+z9)?(z1+2z4+z7)(3.64)g_y = \partial f/ \partial y = (z_3 + 2z_6 + z_9) - (z_1 +2z_4 + z_7) \tag{3.64}gy?=?f/?y=(z3?+2z6?+z9?)?(z1?+2z4?+z7?)(3.64)
M(x,y)=[gx2+gy2]1/2=[[(z7+2z8+z9)?(z1+2z2+z3)]2+[(z3+2z6+z9)?(z1+2z4+z7)]2]1/2(3.65)M(x, y) = [g_x^2 + g_y^2]^{1/2} = \Big[[(z_7 + 2z_8 + z_9) - (z_1 +2z_2 + z_3)]^2 + [(z_3 + 2z_6 + z_9) - (z_1 +2z_4 + z_7)]^2\Big]^{1/2} \tag{3.65}M(x,y)=[gx2?+gy2?]1/2=[[(z7?+2z8?+z9?)?(z1?+2z2?+z3?)]2+[(z3?+2z6?+z9?)?(z1?+2z4?+z7?)]2]1/2(3.65)

def visualize_show_annot(img_show, img_annot, ax, string='img_annot'):"""add annotation to the image, values of each pixelparam: img: input imageparam: ax: axes of the matplotlib"""height, width = img_annot.shapeimg_show = img_show[:height, :width]ax.imshow(img_show, cmap='gray', vmin=0, vmax=255)thresh = 10 #img_show.max()/2.5for x in range(height):for y in range(width):if string == 'img_annot':ax.annotate(str(round(img_annot[x][y],2)), xy=(y,x),horizontalalignment='center',verticalalignment='center',color='white' if img_annot[x][y]>thresh else 'black')else:ax.annotate(string + str(x + y + 1), xy=(y,x),horizontalalignment='center',verticalalignment='center',color='white' if img_annot[x][y]>thresh else 'black') # 一階導(dǎo)數(shù)算子,羅伯特交叉梯度算子,Sobel算子 height, width = 3, 3 img_show = np.ones([height, width], dtype=np.uint8) * 250 img_ori = np.zeros([height, width], dtype=np.uint8)fig = plt.figure(figsize=(8, 6)) ax1 = fig.add_subplot(2, 3, 1) ax1.set_title('3x3 Region'), visualize_show_annot(img_show, img_ori, ax1, string='z'), plt.xticks([]), plt.yticks([])img_ori = np.zeros([2, 2], np.int) img_ori[0, 0] = -1 img_ori[1, 1] = 1 ax2 = fig.add_subplot(2, 3, 2) ax2.set_title('Robert operator'), visualize_show_annot(img_show, img_ori, ax2), plt.xticks([]), plt.yticks([])img_ori = np.zeros([2, 2], np.int) img_ori[0, 1] = -1 img_ori[1, 0] = 1 ax3 = fig.add_subplot(2, 3, 3) ax3.set_title('Robert operator'), visualize_show_annot(img_show, img_ori, ax3), plt.xticks([]), plt.yticks([])img_ori = np.zeros([3, 3], np.int) img_ori[0, :] = np.array([-1, -2, -1]) img_ori[2, :] = np.array([1, 2, 1]) ax4 = fig.add_subplot(2, 3, 4) ax4.set_title('Sobel operator'), visualize_show_annot(img_show, img_ori, ax4), plt.xticks([]), plt.yticks([])img_ori = np.zeros([3, 3], np.int) img_ori[:, 0] = np.array([-1, -2, -1]) img_ori[:, 2] = np.array([1, 2, 1]) ax5 = fig.add_subplot(2, 3, 5) ax5.set_title('Sobel operator'), visualize_show_annot(img_show, img_ori, ax5), plt.xticks([]), plt.yticks([])plt.tight_layout() plt.show()

# Sobel梯度增強(qiáng)邊緣 img_ori = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH03/Fig0342(a)(contact_lens_original).tif", 0)sobel_x = np.zeros([3, 3], np.int) sobel_x[0, :] = np.array([-1, -2, -1]) sobel_x[2, :] = np.array([1, 2, 1])sobel_y = np.zeros([3, 3], np.int) sobel_y[:, 0] = np.array([-1, -2, -1]) sobel_y[:, 2] = np.array([1, 2, 1])# gx = separate_kernel_conv2D(img_ori, kernel=sobel_x) # gy = separate_kernel_conv2D(img_ori, kernel=sobel_y)gx = cv2.filter2D(img_ori, ddepth=-1, kernel=sobel_x) gy = cv2.filter2D(img_ori, ddepth=-1, kernel=sobel_y)gx = np.where(gx >= 100, gx, 0) gx = np.where(gx < 100, gx, 1) gy = np.where(gy >= 100, gy, 0) gy = np.where(gy < 100, gy, 1)# 先對(duì)gx gy做二值化處理再應(yīng)用下面的公式 # img_sobel = np.sqrt(gx**2 + gy**2) # 二值化后,平方根的效果與絕對(duì)值很接近 img_sobel = abs(gx) + abs(gy) img_sobel = np.uint8(normalize(img_sobel) * 255)plt.figure(figsize=(15, 12)) plt.subplot(1, 2, 1), plt.imshow(img_ori, 'gray', vmax=255), plt.title("Original"), plt.xticks([]), plt.yticks([]) plt.subplot(1, 2, 2), plt.imshow(img_sobel, 'gray', vmax=255), plt.title("Sobel"), plt.xticks([]), plt.yticks([]) plt.tight_layout() plt.show()

梯度還可用來(lái)突出灰度級(jí)圖像中很難看到的小尺度圖像(如異物、保護(hù)液中的氣泡或鏡片中的微小缺陷)。在平坦的灰度場(chǎng)中增強(qiáng)小的不連續(xù)的能力是梯度的呬個(gè)重要特征

總結(jié)

以上是生活随笔為你收集整理的第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波17 - 锐化高通滤波器 - 梯度图像(罗伯特,Sobel算子)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。