我們將在本文中介紹以下高級(jí)圖像處理操作:
- Canny 邊緣檢測(cè)
- 輪廓和形狀識(shí)別
Canny 邊緣檢測(cè) :Canny 邊緣檢測(cè)是一種流行的邊緣檢測(cè)算法。它是由 John F. Canny 在 1986 年開發(fā)的。它是一個(gè)多階段算法,我們將按如下方式經(jīng)歷每個(gè)階段:
- 噪聲抑制: 第一步是使用高斯平滑從圖像中去除噪聲,這涉及使用高斯核,其中靠近核中心的像素被賦予比遠(yuǎn)處像素更多的權(quán)重。
- 梯度計(jì)算 :應(yīng)用Sobel 濾波器計(jì)算圖像的梯度以計(jì)算邊緣強(qiáng)度和方向,該濾波器突出顯示 x 和 y 軸上的強(qiáng)度變化。
- Non-Maximum Suppression: Non-Maximum Suppression通過遍歷上一步生成的梯度矩陣中的所有值來尋找邊緣方向強(qiáng)度更大的像素,從而減少邊緣的厚度。
- 雙閾值滯后: 最后一步使用輸入?yún)?shù)下閾值和上限閾值來過濾掉潛在邊緣,根據(jù)以下標(biāo)準(zhǔn)丟棄不相關(guān)的邊緣:
如果像素梯度值高于上限閾值,則像素被接受為邊緣。
如果像素梯度值低于下限閾值,則像素被拒絕。
如果像素梯度值介于兩個(gè)閾值之間,則僅當(dāng)它連接到高于閾值上限的像素時(shí)才會(huì)被接受。
ImgProc類為 Canny 邊緣檢測(cè)提供了一個(gè)Canny方法,該方法采用以下參數(shù):
- Source Image: Mat
- Output edges: Mat
- Lower Threshold: double
- Upper Threshold: double
public static Mat cannyEdges(Mat img){
Mat canny = new Mat();
Imgproc.Canny(img,canny,30,100);
return canny;
}
Canny 邊緣檢測(cè)

原始圖像

Canny 邊緣檢測(cè)

雙邊濾波圖像上的 Canny 邊緣檢測(cè)
注意:Canny 邊緣檢測(cè)算法基于梯度,因此對(duì)圖像噪聲高度敏感。因此,在灰度圖像上應(yīng)用 Canny 邊緣檢測(cè)是一種很好的做法。
**輪廓:**輪廓可以定義為連接沿邊界具有相同強(qiáng)度的所有連續(xù)點(diǎn)的曲線。它們對(duì)于形狀分析和對(duì)象檢測(cè)很有用。
使用二值圖像查找輪廓是一種很好的做法。二值圖像是這樣的圖像,其中每個(gè)像素只能有兩個(gè)可能的強(qiáng)度值(0 表示黑色,1 或 255 表示白色)。
ImgProc 類提供了一種用于生成二值圖像的閾值方法,該方法使用以下參數(shù):
- Source Image: Mat - grayscale image
- Output Image: Mat
- Threshold : double: 如果像素值小于閾值,則設(shè)置為 0。
- Maximum:雙精度 - 分配給超過閾值的像素的最大值。
- Type of threshold:int - OpenCV 提供不同類型的閾值技術(shù),如 OTSU 、TOZERO等。
public static Mat convertToBinary(Mat img){
Mat binImg = new Mat();
Imgproc.threshold(img,binImg,125 ,255,Imgproc.THRESH_BINARY);
return binImg;
}
圖像轉(zhuǎn)換為二進(jìn)制

二進(jìn)制圖像
尋找輪廓:ImgProc 類提供了一個(gè)findContours方法,該方法接受以下輸入?yún)?shù):
- Image:Mat - 二進(jìn)制圖像
- Contours : List- 檢測(cè)到的輪廓存儲(chǔ)在這個(gè)列表中
- Hierarchy : Mat - 存儲(chǔ)有關(guān)圖像拓?fù)涞男畔?/li>
- Contour Retrieval Mode:int - OpenCV 提供以下檢索模式:
- RETR_LIST(0) :檢索所有輪廓而不保持層次關(guān)系。
- RETR_EXTERNAL(1): 僅檢索所有極端外輪廓。
- RETR_CCOMP(2): 檢索所有輪廓并將它們排列到 2 級(jí)層次結(jié)構(gòu)中。對(duì)象的外部輪廓放置在層次 1 中,對(duì)象內(nèi)部的孔的輪廓放置在層次 2 中。
- RETR_TREE(3): 檢索所有輪廓并創(chuàng)建完整的層次結(jié)構(gòu)列表。
- Contour Approximation Method : int - 近似方法指定存儲(chǔ)邊界坐標(biāo)的方式。
- CHAIN_APPROX_NONE: 存儲(chǔ)所有邊界點(diǎn)。
- CHAIN_APPROX_SIMPLE :去除冗余點(diǎn)并壓縮輪廓;例如:對(duì)于一條線,存儲(chǔ)兩個(gè)端點(diǎn)。
public static void findAndDrawContours(Mat binImg,Mat org){
List
Imgproc.findContours(binImg,contourList,new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(org, contourList, -1, new Scalar(50, 205, 50), 2);
HighGui.imshow("Contours",org);
HighGui.waitKey();
}
查找和繪制輪廓
繪制輪廓: ImgProc 類提供了一個(gè)drawContours方法,該方法使用以下參數(shù):
- Image:Mat - 目標(biāo)圖像
- Contour List:List< MatOfPoint>
- Contour Index: int - 要繪制的輪廓索引,負(fù)值表示所有輪廓都已繪制。
- Color:Scalar - 輪廓的顏色。
- Thickness:int - 邊界線的厚度。

輪廓
使用輪廓進(jìn)行形狀檢測(cè): 我們可以使用輪廓來根據(jù)近似曲線中的周長(zhǎng)、面積和陣列點(diǎn)的數(shù)量來檢測(cè)形狀。ImgProc 類提供了一個(gè)approxPolyDP方法,該方法返回基于輪廓的近似曲線并使用以下參數(shù):
- curve:MatOfPoint2f
- approxCurve: MatOfPoint2f - 輸出曲線
- epsilon: double - Epsilon 指定近似精度。這是原始曲線與其近似值之間的最大距離,我們可以使用 ImgProc arcLength 方法(返回曲線長(zhǎng)度或周長(zhǎng))進(jìn)行優(yōu)化。
- closed:布爾值 - 如果近似曲線是閉合的,則為 true,否則為 false。
public static void shapeDetection(Mat binImg,Mat org){
List
List
Imgproc.findContours(binImg,contourList,new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
for(int i=0;i
point.fromList(contourList.get(i).toList());
MatOfPoint2f approxCurve = new MatOfPoint2f();
double parameter = Imgproc.arcLength(point, true);
Imgproc.approxPolyDP(point, approxCurve, parameter * 0.02, true);
long total = approxCurve.total();
//Detecting Rectangle Shape
if (total == 4) {
double area = Imgproc.contourArea(contourList.get(i));
//rectangle with area greater than 500
if(area>500)
selectedContours.add(contourList.get(i));
}
}
Imgproc.drawContours(org, selectedContours, -1, new Scalar(50, 205, 50), 3);
HighGui.imshow("Contours",org);
HighGui.waitKey();
}
使用輪廓進(jìn)行形狀檢測(cè)
-
圖像處理
+關(guān)注
關(guān)注
29文章
1342瀏覽量
59513 -
邊緣檢測(cè)
+關(guān)注
關(guān)注
0文章
94瀏覽量
18673 -
噪聲抑制
+關(guān)注
關(guān)注
0文章
35瀏覽量
12510
發(fā)布評(píng)論請(qǐng)先 登錄
Java中的常用異常處理方法 java推薦
基于Java技術(shù)的法醫(yī)圖像邊緣檢測(cè)的研究
淺析監(jiān)控圖像處理系統(tǒng)的軟件結(jié)構(gòu)
JAVA教程之從網(wǎng)絡(luò)取得圖像
圖像處理教程之圖像的鄰域操作資料說明
10個(gè)Java編程中異常處理最佳實(shí)踐
JAVA中NIO通過MappedByteBuffer操作大文件
視覺圖像系統(tǒng)中,ROI如何做顯示處理以及具體操作步驟
FPGA中如何使用Verilog處理圖像
java實(shí)時(shí)圖像與處理庫教程演示
形態(tài)學(xué)運(yùn)算與仿真:圖像處理中形態(tài)學(xué)操作的簡(jiǎn)單解釋
淺析Java中的圖像處理操作
評(píng)論