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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图像梯度算子的本质

發布時間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像梯度算子的本质 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面我們介紹過圖像的梯度,其定義是根據微積分的定義在二維離散函數中推導出來的。但是,我們需要理解,梯度只是一個工具,方法,核心目的是得到像素點與其相鄰像素的灰度值變化情況,并通過這種變化來增強圖像。這種原始定義的梯度只是這種灰度值變化情況的度量工具。

我們再回顧一下,假設某像素與其8領域用如下矩陣表示:

那么,根據圖像梯度的定義:
gx = z8 - z5
gy = z6 - z5
上面提到,這種原始定義的梯度只是這種灰度值變化情況的度量工具,這種度量工具只有這一種嗎?顯然不是的!
z9-z5算不算灰度值的變化?z1-z5呢?z7-z5呢?z4-z5呢?z3-z5呢?

我們利用梯度的本質目的,是要找到某像素與其相鄰像素的灰度差值,并放大這種差值,從而用于圖像增強。而原始定義的梯度計算方法只是灰度差值計算方法中的一種,還可以有其它計算方法來度量這種變化。

為簡化起見,我們把這些計算方法統稱為梯度算子。根據不同的相鄰像素差值計算得到的效果可能有所不同,但基本原理是一致的。

例如羅伯特(Roberts)交叉梯度算子,定義的是:
gx = z9-z5
gy = z8-z6
為什么名字中有“交叉”,看看下圖就知道了。

我們可以看到,不管是原始梯度也好,Roberts算子也好,都只是利用了z5,z6,z8,z9的像素值,那么可不可以擴展到8領域呢,當然是可以的。

例如,你可以自己定義一個:
gx = (z7+z8+z9)-(z1+z2+z3)
gy = (z3+z6+z9)-(z1+z4+z7)

事實上,這個你自定義的算子和著名的Sobel算子非常接近了,只是Sobel算子增加了距離權重而已。Sobel算子的定義如下(與中心點Z5更近的點Z3,Z4,Z6,Z8的權重為2,其它對角線上的權重為1):
gx = (z7+2*z8+z9)-(z1+2*z2+z3)
gy = (z3+2*z6+z9)-(z1+2*z4+z7)

關于Sobel算子后面還會再重點介紹,下面用Roberts交叉算子來看看圖像增強的效果。

import cv2 import numpy as npmoon = cv2.imread("moon.tif", 0) row, column = moon.shape moon_f = np.copy(moon) moon_f = moon_f.astype("float")Roberts = np.zeros((row, column))for x in range(row - 1):for y in range(column - 1):gx = abs(moon_f[x + 1, y + 1] - moon_f[x, y])gy = abs(moon_f[x + 1, y] - moon_f[x, y + 1])Roberts[x, y] = gx + gysharp = moon_f + Roberts sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp)) sharp = sharp.astype("uint8")cv2.imshow("moon", moon) cv2.imshow("Roberts_sharp", sharp) cv2.waitKey()

輸出結果:

再看看用上面自定義算子的情況: user_defined = np.zeros((row, column))for x in range(1, row - 1):for y in range(1, column - 1):gx = abs((moon_f[x + 1, y - 1] + moon_f[x + 1, y] + moon_f[x + 1, y + 1]) - (moon_f[x - 1, y - 1] + moon_f[x - 1, y] + moon_f[x - 1, y + 1]))gy = abs((moon_f[x - 1, y + 1] + moon_f[x, y + 1] + moon_f[x + 1, y + 1]) - (moon_f[x - 1, y - 1] + moon_f[x, y - 1] + moon_f[x + 1, y - 1]))user_defined[x, y] = gx + gysharp = moon_f + user_defined sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp)) sharp = sharp.astype("uint8")cv2.imshow("moon", moon) cv2.imshow("defined_sharp", sharp) cv2.waitKey()

輸出結果:

總結

以上是生活随笔為你收集整理的图像梯度算子的本质的全部內容,希望文章能夠幫你解決所遇到的問題。

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