文章目錄
⛅️前言
⛅️阈值分割基礎理論知識
⛅️阈值處理代碼及實現講解
⛅️圖像平滑概念及具體知識
均值濾波
方框濾波
高斯濾波
中值濾波
卷積
⛅️前言
OpenCV提供的視覺處理算法非常豐富,并且它部分以C語言編寫,加上其開源的特性,處理得當,不需要添加新的外部支持也可以完整的編譯鍊接生成執行程序,所以很多人用它來做算法的移植,OpenCV的代碼經過适當改寫可以正常的運行在DSP系統和ARM嵌入式系統中,這種移植在大學中經常作為相關專業本科生畢業設計或者研究生課題的選題。 |
OpenCV緻力于真實世界的實時應用,通過優化的C代碼的編寫對其執行速度帶來了可觀的提升,并且可以通過購買Intel的IPP高性能多媒體函數庫得到更快的處理速度。 |
可應用領域包括: 1、人機互動 2、物體識别 3、圖像分割 4、人臉識别 5、動作識别 6、運動跟蹤 7、機器人 8、運動分析 9、機器視覺 10、結構分析 11、汽車安全駕駛等方面 |
阈值分割得六種形态圖:
1.第一種為原始圖像像素值分布圖。2.二進制阈值化:假設我們設定阈值為189,如果大于189得像素值那麼我們就把該像素值設置為最大值,也就是255。如果低于189得像素值,那麼我們就設置該像素值為0。
3.反二進制阈值化:根據意思我們就可以知道和二進制阈值化相反,那麼就說明如果我們設定阈值為189,那麼大于189得像素值就是0,如果低于189得像素值,那麼就設定像素值為255.
4.截斷阈值化:假設我們設定阈值時127,那麼如果像素值大于127,那麼我們直接設定像素值為127,如果低于127,那麼就保持像素值不變。
5.反阈值化為0:假如我們設定阈值為127,那麼如果像素大于127,那麼我們将新的像素值設定為0,如果低于127,那麼我們将保留原始得像素值。
6.阈值化為0:假設我們依舊設定阈值為127,那麼如果像素值高于127,那麼我們保持不變,如果低于127,那麼我們設定新的像素值為0.
⛅️阈值處理代碼及實現講解
阈值處理函數:函數threshold
retval, dst=cv2.threshold(src, thresh, maxval, type) 1
其中src表示原圖像,thresh表示阈值,maxval表示最大值,type表示類型。函數對應返回兩個值,分别是阈值和處理結果。
二進制阈值化代碼:核心代碼:cv2.THRESH_BINARY
import cv2 a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED) r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY) cv2.imshow("a",a) cv2.imshow("b",b) cv2.waitKey() cv2.destroyAllWindows() 1234567
以lena為例子,處理結果是:
可以看出來,将原來的灰度圖像處理成了隻有0和最大值255的圖像,可以說處理成了二值圖像。反二進制阈值化代碼:核心代碼:cv2.THRESH_BINARY_INV
import cv2 a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED) r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV) cv2.imshow("a",a) cv2.imshow("b",b) cv2.waitKey() cv2.destroyAllWindows() 1234567
這裡隻需要改動一個位置就可以,那麼處理結果為:
就是和原來的二進制阈值化相反處理。截斷阈值化:核心代碼:cv2.THRESH_TRUNC
import cv2 a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED) r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC) cv2.imshow("a",a) cv2.imshow("b",b) cv2.waitKey() cv2.destroyAllWindows() 1234567
處理結果:
也就是說将圖像的明亮部分都處理在阈值以下。反阈值化為0代碼:核心代碼:cv2.THRESH_TOZERO_INV
port cv2 a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED) r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV) cv2.imshow("a",a) cv2.imshow("b",b) cv2.waitKey() cv2.destroyAllWindows() 1234567
處理結果是:
将所有亮的地方都處理為黑色。也就是說高于阈值的地方都處理呈黑色。
阈值化為0代碼:核心代碼:cv2.THRESH_TOZERO
import cv2 a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED) r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO) cv2.imshow("a",a) cv2.imshow("b",b) cv2.waitKey() cv2.destroyAllWindows() 1234567
将低于阈值部分都處理成黑色,其他不變。
⛅️圖像平滑概念及具體知識均值濾波
✒️均值濾波:很明顯我們通過白話來講就是說肯定跟平均值有關,那麼怎麼和平均值相關的呢?
首先我們來看一下一個圖像的區域像素值分布:
然後我們來看中間區域的紅色部分為例子進行均值濾波處理計算:紅色點的像素新值=藍色背景區域像素值之和除25紅色點的像素新值=((197 25 106 156 159) (149 40 107 5 71) (163 198 226 223 156) (222 37 68 193 157) (42 72 250 41 75))/25
針對原始圖像内的像素點,逐個采用核進行處理,得到結果圖像。也就是說每一個像素點都進行這個操作。那麼有什麼用呢?作用就是可以把尖銳的像素點的值給模糊掉然我們來看例子函數結果:處理結果=cv2.blur(原始圖像,核大小)核大小:以(寬度,高度)形式表示的元組
import cv2 o=cv2.imread("image\\lenaNoise.png") r=cv2.blur(o,(5,5)) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 1234567
專業一點來講就是可以除噪:
方框濾波
⚽️方框濾波:主要是看函數的最後一個屬性,如果設置為-1,那麼方框濾波與均值濾波一樣的效果,如果設置成1,那麼就表示核函數内進行相加。具體請看下面講解。
主要函數:boxFilter。 ⚽️運行結果=cv2. boxFilter(原始圖像,目标圖像深度,核大小,normalize屬性),⚽️其中原始圖像都理解,⚽️目标圖像深度通常設置成-1,表示與原始圖像相同,⚽️核函數請看下方圖一,如果設置呈元組(5,5)就表示為下方左邊圖。⚽️normalize屬性表示是否對圖像進行歸一化處理,如果進行歸一化處理就設置成ture,不設置就為false。⚽️那麼如果設置歸一化處理的結果就是與均值濾波完全一緻,如果不設置歸一化處理,那麼就表示核函數之間相加。看圖二
⚽️方框濾波代碼部分normalize=1就表示進行歸一化處理,和不設置一樣,也就是說默認就是進行歸一化處理。如果設置為0,就表示不進行歸一化處理。代碼分别是:
import cv2 o=cv2.imread("image\\lenaNoise.png") r=cv2.boxFilter(o,-1,(5,5),normalize=1) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 1234567
import cv2 o=cv2.imread("image\\lenaNoise.png") r=cv2.boxFilter(o,-1,(5,5),normalize=0) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 1234567
對應結果分别是:
不進行歸一化處理如果5×5的值相加很容易超過255,那麼我們就都變成了255的像素值,也就都是白色了。那麼如果我們設置核函數為2×2呢,讓核函數小一點。那麼對應的結果為:
這樣濾波後的結果就不都是255了,就變成了有的地方的像素值是小于255的。但是像素值都比之前要高很多。
高斯濾波
高斯濾波:其實高斯濾波很簡單,原理就是誰離我目标點越近,我就跟誰越好,給他的東西越多,對應官方的話就是給予權重越大。讓臨近的像素值有更高的重要度。
高斯濾波核心函數:GaussianBlur函數。
dst = cv2.GaussianBlur( src , ksize , sigmaX )
其中:src為原始圖像ksize核函數的大小,這裡需要注意,就是設置的核函數的大小必須為奇數大小sigmaX表示高斯濾波函數X方向的方差,這裡表示成水平方向的規律就好了。用來控制權重。sigmaX=0時: sigma = 0.3((ksize-1)0.5 - 1) 0.8
高斯濾波對應代碼:
import cv2 o=cv2.imread("image\\lenaNoise.png") r=cv2.GaussianBlur(o,(3,3),0) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 1234567
這裡可以看出,使用高斯濾波可以完成去噪的功能,但是他是緩和的去噪,根據他的原理我們就可以知道。
中值濾波
中值濾波:這裡就很好理解了,比如我們取了核函數的大小,然後把核函數中的像素值進行排序,然後取中值替換到現在的值。
主要函數:medianBlur函數
dst = cv2.medianBlur( src , ksize )
其中src表示原始圖像,ksize表示核函數的大小。同樣這裡的核函數的大小必須是奇數。且不是原則,直接寫數字就可以,比如3就表示3*3
中值濾波代碼部分
import cv2 o=cv2.imread("image\\lenaNoise.png") r=cv2.medianBlur(o,3) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 1234567
這裡去噪最為完美因為很明顯的就把很高的像素點都去掉了!!!
卷積
卷積:其實卷積也很簡單的,之前我們介紹的均值濾波、中值濾波、方框濾波及高斯濾波都是基于圖像本身做出操作,那麼卷積就是我們設置了一個卷積核,用這個核去和我們圖像的每一個像素值做乘法。
2D卷積核心函數:卷積核函數:kernel = np.ones((5,5),np.float32)/25設置的是5*5的卷積核。如圖:
2D卷積核心函數:r=cv2.filter2D( o , -1 ,f )-1表示圖像深度和原圖像一緻,最後一個f表示卷積核的意思。代碼部分:
import cv2 import numpy as np o=cv2.imread("image\lenacolor.png") f=np.ones((5,5),np.float32)/25 r=cv2.filter2D(o,-1,f) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 123456789
所以我們可以通過原理得到如果卷積核設置的越大,那麼圖像就會越模糊。
import cv2 import numpy as np o=cv2.imread("image\lenacolor.png") f=np.ones((10,10),np.float32)/100 r=cv2.filter2D(o,-1,f) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() 123456789
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!