當前位置:首頁 » 編程語言 » pythonopencv銳化

pythonopencv銳化

發布時間: 2023-03-05 07:15:08

① 圖片處理-opencv-10.圖像銳化與邊緣檢測

 

Roberts運算元又稱為交叉微分演算法,它是基於交叉差分的梯度演算法,通過局部差分計算檢測邊緣線條。常用來處理具有陡峭的低雜訊圖像,當圖像邊緣接近於正45度或負45度時,該演算法處理效果更理想。其缺點是對邊緣的定位不太准確,提取的邊緣線條較粗。

Prewitt是一種圖像邊緣檢測的微分運算元,其原理是利用特定區域內像素灰度值產生的差分實現邊緣檢測。由於Prewitt運算元採用3 3模板對區域內的像素值進行計算,而Robert運算元的模板為2 2,故Prewitt運算元的邊緣檢測結果在水平方向和垂直方向均比Robert運算元更加明顯。Prewitt運算元適合用來識別雜訊較多、灰度漸變的圖像。

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

RSobel運算元是一種用於邊緣檢測的離散微分運算元,它結合了高斯平滑和微分求導。該運算元用於計算圖像明暗程度近似值,根據圖像邊緣旁邊明暗程度把該區域內超過某個數的特定點記為邊緣。Sobel運算元在Prewitt運算元的基礎上增加了權重的概念,認為相鄰點的距離遠近對當前像素點的影響是不同的,距離越近的像素點對應當前像素的影響越大,從而實現圖像銳化並突出邊緣輪廓。Sobel運算元的邊緣定位更准確,常用於雜訊較多、灰度漸變的圖像。

Sobel運算元根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向信息。因為Sobel運算元結合了高斯平滑和微分求導(分化),因此結果會具有更多的抗噪性,當對精度要求不是很高時,Sobel運算元是一種較為常用的邊緣檢測方法。

dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

在進行Sobel運算元處理之後,還需要調用convertScaleAbs()函數計算絕對值,並將圖像轉換為8點陣圖進行顯示

dst = convertScaleAbs(src[, dst[, alpha[, beta]]])

拉普拉斯(Laplacian)運算元是n維歐幾里德空間中的一個二階微分運算元,常用於圖像增強領域和邊緣提取。它通過灰度差分計算鄰域內的像素,基本流程是:判斷圖像中心像素灰度值與它周圍其他像素的灰度值,如果中心像素的灰度更高,則提升中心像素的灰度;反之降低中心像素的灰度,從而實現圖像銳化操作。在演算法實現過程中,Laplacian運算元通過對鄰域中心像素的四方向或八方向求梯度,再將梯度相加起來判斷中心像素灰度與鄰域內其他像素灰度的關系,最後通過梯度運算的結果對像素灰度進行調整。

Laplacian運算元分為四鄰域和八鄰域,四鄰域是對鄰域中心像素的四方向求梯度,八鄰域是對八方向求梯度。當鄰域內像素灰度相同時,模板的卷積運算結果為0;當中心像素灰度高於鄰域內其他像素的平均灰度時,模板的卷積運算結果為正數;當中心像素的灰度低於鄰域內其他像素的平均灰度時,模板的卷積為負數。對卷積運算的結果用適當的衰弱因子處理並加在原中心像素上,就可以實現圖像的銳化處理。

dst = Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

由於Sobel運算元在計算相對較小的核的時候,其近似計算導數的精度比較低,比如一個33的Sobel運算元,當梯度角度接近水平或垂直方向時,其不精確性就越發明顯。Scharr運算元同Sobel運算元的速度一樣快,但是准確率更高,尤其是計算較小核的情景,所以利用3*3濾波器實現圖像邊緣提取更推薦使用Scharr運算元

Scharr運算元又稱為Scharr濾波器,也是計算x或y方向上的圖像差分,在OpenCV中主要是配合Sobel運算元的運算而存在的。Scharr運算元的函數原型如下所示,和Sobel運算元幾乎一致,只是沒有ksize參數.

dst = Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]])

Canny邊緣檢測運算元(多級邊緣檢測演算法)是一種被廣泛應用於邊緣檢測的標准演算法,其目標是找到一個最優的邊緣檢測解或找尋一幅圖像中灰度強度變化最強的位置。最優邊緣檢測主要通過低錯誤率、高定位性和最小響應三個標准進行評價。

Canny運算元的實現步驟如下:

edges = Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

LOG(Laplacian of Gaussian)邊緣檢測運算元也稱為Marr&Hildreth運算元,它根據圖像的信噪比來求檢測邊緣的最優濾波器。該演算法首先對圖像做高斯濾波,然後再求其拉普拉斯(Laplacian)二階導數,根據二階導數的過零點來檢測圖像的邊界,即通過檢測濾波結果的零交叉(Zero crossings)來獲得圖像或物體的邊緣。

LOG運算元該綜合考慮了對雜訊的抑制和對邊緣的檢測兩個方面,並且把Gauss平滑濾波器和Laplacian銳化濾波器結合了起來,先平滑掉雜訊,再進行邊緣檢測,所以效果會更好。 該運算元與視覺生理中的數學模型相似,因此在圖像處理領域中得到了廣泛的應用。它具有抗干擾能力強,邊界定位精度高,邊緣連續性好,能有效提取對比度弱的邊界等特點。

python視覺識別--OpenCV開閉操作\分水嶺演算法(九)

閉操作:
1、圖像形態學的重要操作之一,基於膨脹與腐蝕操作組合形成的
2、主要是應用在二值圖像分析中,灰度圖像也可以
3、開操作=膨脹+腐蝕,輸入圖像+結構元素
開操作:
1、圖像形態學的重要操作之一,基於膨脹與腐蝕操作組合形成的
2、主要是應用在二值圖像分析中,灰度圖像也可以
3、開操作=腐蝕+膨脹,輸入圖像+結構元素
開操作與閉操作的區別是:膨脹與腐蝕的順序
開操作作用:消除圖像中小的干擾區域
閉操作作用:填充小的封閉區域

③ 如何用python對dicom文件進行銳化處理

問題表述不當,是對圖像銳化處理吧。首先,使用pydicom讀取dicom文件獲得圖像,例如CT圖像,然後,應用圖像庫做銳化處理,常用的庫有PIL,opencv,skiamge等。

④ OpenCV (一)Mat基本操作以及灰度圖轉化

開始寫OpenCV這篇文章的時候,不由想到,我的大學計算機圖形學的第一門實操課程就是灰度轉化,拉普拉斯銳化等。其中灰度圖的轉化,是計算機圖形學基礎中基礎,這里就順著OpenCV的灰度的轉化,來看看OpenCV一些基礎的api。

本文地址: https://www.jianshu.com/p/7963c7dbaf92

先來看看OpenCV,基礎對象Mat,矩陣。什麼是矩陣,實際上沒有必要解釋,一般人都能夠明白數學意義上矩陣的含義。

OpenCV把每一個M * N的寬高圖像,看成M*N的矩陣。矩陣的每一個單元就對應著圖像中像素的每一個點。

我們如果放大圖中某個部分,就會發現如下情況

圖像實際上就如同矩陣一樣每個單元由一個像素點構成。

因為OpenCV的Mat每一個像素點,包含的數據不僅僅只有一個單純的數字。每一個像素點中包含著顏色通道數據。

稍微解釋一下顏色通道,我們可以把世間萬物肉眼能識別的顏色由3種顏色(R 紅色,G 綠色,B 藍色)經過調節其色彩飽和度組成的。也就是說通過控制RGB三種的色值大小(0~255)來調配新的顏色。

當我們常見的灰度圖,一般是單個顏色通道,因為只用黑白兩種顏色。我們常見的圖片,至少是三色通道,因為需要RGB三種顏色通道。

我們常見Android的Bitmap能夠設置ARGB_8888的標志位就是指能夠通過A(透明通道),R,G,B來控制圖片載入的顏色通道。

OpenCV為了更好的控制這些數據。因此採用了數學上的矩陣的概念。當OpenCV要控制如RGB三色通道的Mat,本質上是一個M * N * 3的三維矩陣。

但是實際上,我們在使用OpenCV的Mat的時候,我們只需要關注每個圖片的像素,而每個像素的顏色通道則是看成Mat中每個單元數據的內容即可

我們先來看看Mat的構造方法

現階段,實際上我們值得我們注意的是構造函數:

舉個例子:

這個mat矩陣將會製造一個高20,寬30,一個1位元組的顏色通道(也是Mat中每一個像素數據都是1位元組的unchar類型的數據),同時顏色是白色的圖片。

在這裡面我們能夠看到一個特殊的宏CV_8UC1。實際上這是指代OpenCV中圖片帶的是多少顏色通道的意思。

這4個宏十分重要,要時刻記住。

當我們需要把Mat 中的數據拷貝一份出來,我們應該調用下面這個api:

這樣就能拷貝一份像素數據到新的Mat中。之後操作新的Mat就不會影響原圖。

實際上,在本文中,我們能夠看到OpenCV是這么調用api讀取圖片的數據轉化為Mat矩陣。

OpenCV會通過imread去讀圖片文件,並且轉化為Mat矩陣。

能看見imread,是調用imread_把圖片中的數據拷貝的img這個Mat對象中。接著會做一次圖片的顛倒。這個方面倒是和Glide很相似。
文件:moles/imgcodecs/src/loadsave.cpp

這裡面做了幾個事情,實際上和FFmpge的設計十分相似。

其核心也是操作Mat中的像素指針,找到顏色通道,確定指針移動的步長,賦值圖片的數據到Mat矩陣中。核心如下:

其中還涉及到jpeg的哈夫曼演算法之類的東西,這里就不深入源碼。畢竟這是基礎學習。

什麼是灰度圖,灰度度圖實際上我們經常見到那些灰白的也可以納入灰度圖的范疇。實際上在計算機圖形學有這么一個公式:
將RGB的多顏色圖,通過 的演算法,將每一個像素的圖像的三顏色通道全部轉化為為一種色彩,通過上面的公式轉為為一種灰色的顏色。

一旦了解了,我們可以嘗試編寫灰度圖的轉化。我們通過矩陣的at方法訪問每一個像素中的數據。

為了形象表示矩陣指針,指向問題,可以把RGB在OpenCV的Mat看成如下分布:

記住OpenCV的RGB的順序和Android的不一樣,是BGRA的順序。和我們Android開發顛倒過來。

因此,我們可以得到如下的例子

我們經過嘗試之後,確實能夠把一個彩色的圖片轉化一個灰色圖片。但是這就是

這里介紹一下Mat的一個api:

實際上OpenCV,內置了一些操作,可以把RGB的圖像數據轉化灰度圖。

我們看看OpenCV實際上的轉化出來的灰度圖大小。我們通過自己寫的方法,轉化出來的灰度圖是119kb,而通過cvtColor轉化出來的是44kb。

問題出在哪裡?還記得嗎?因為只有灰白兩種顏色,實際上只需要一種顏色通道即可,而這邊還保留了3個顏色通道,也就說圖片的每一個像素點中的數據出現了沒必要的冗餘。

這樣就是44kb的大小。把三顏色通道的數據都設置到單顏色通道之後,就能進一步縮小其大小。

實際上在Android中的ColorMatrix中也有灰度圖轉化的api。

對畫筆矩陣進行一次,矩陣變化操作。

實際上就是做了一次矩陣運算。繪制灰度的時候相當於構建了這么一個矩陣

接著通過矩陣之間的相乘,每一行的 0.213f,0.715f,0.072f控制像素的每個通道的色值。
對於Java來說,灰度轉化的演算法是: ,把綠色通道的比例調大了。

在OpenCV中有這么兩個API,add和addWidget。兩者都是可以把圖像混合起來。

add和addWidget都是將像素合並起來。但是由於是像素直接相加的,所以容易造成像素接近255,讓整個像素泛白。

而權重addWeighted,稍微能減輕一點這種問題,本質上還是像素相加,因此打水印一般不是使用這種辦法。
等價於

saturate_cast這個是為了保證計算的值在0~255之間,防止越界。

飽和度,圖片中色值更加大,如紅色,淡紅,鮮紅
對比度:是指圖像灰度反差。相當於圖像中最暗和最亮的對比
亮度:暗亮度

控制對比度,飽和度的公式: , ,

因此當我們想要控制三通道的飽和度時候,可以通過alpha來控制色值成比例增加,beta控制一個色值線性增加。
如下:

在這里,看到了OpenCV會把所有的圖片看成Mat矩陣。從本文中,能看到Mat的像素操作可以能看到有兩種,一種是ptr像素指針,一種是at。ptr是OpenCV推薦的更加效率的訪問速度。

當然還有一種LUT的核心函數,用來極速訪問Mat矩陣中的像素。其原理是對著原來的色值進行預先的變換對應(設置一個顏色通道)。用來應對設置閾值等情況。

熱點內容
sqlserver連接驅動 發布:2024-05-06 00:33:34 瀏覽:645
存儲開銷 發布:2024-05-06 00:13:38 瀏覽:953
伺服器怎麼盈利 發布:2024-05-05 23:56:16 瀏覽:941
java網站培訓學校 發布:2024-05-05 23:43:11 瀏覽:40
淘寶搜索演算法 發布:2024-05-05 23:37:07 瀏覽:998
sqlwhencasethen 發布:2024-05-05 23:27:51 瀏覽:641
模架編程軟體 發布:2024-05-05 23:26:54 瀏覽:483
存儲過程異常 發布:2024-05-05 23:24:03 瀏覽:399
winxp訪問不了win7 發布:2024-05-05 23:05:23 瀏覽:734
演算法牛 發布:2024-05-05 22:43:40 瀏覽:720