- OpenCvSharp安裝(一)
- OpenCvSharp讀取、顯示和寫入圖像(二)
- OpenCvSharp圖像裁剪、調(diào)整大小、旋轉(zhuǎn)、透視(三)
- OpenCvSharp基本繪畫(直線、橢圓、矩形、圓、多邊形、文本)(四)
- OpenCvSharp 檢測(斑點檢測、邊緣檢測、輪廓檢測)(五)
- OpenCvSharp 輪廓繪制六步驟(六)
- OpenCvSharp 目標(biāo)檢測五個步驟(七)
- OpenCvSharp透視矯正六步驟(八)
五 、檢測(斑點檢測、邊緣檢測、輪廓檢測)
進行圖像處理時,可以使用不同的算法和函數(shù)來實現(xiàn)斑點檢測、邊緣檢測和輪廓檢測。
1、斑點檢測(Blob)
1)、SimpleBlobDetector
斑點檢測是指在圖像中找到明亮或暗的小區(qū)域(通常表示為斑點),并標(biāo)記它們的位置。
可以使用OpenCV中的函數(shù)SimpleBlobDetector來實現(xiàn)斑點檢測。
該函數(shù)將圖像轉(zhuǎn)換為二進制圖像,然后找到所有的輪廓,通過設(shè)置閾值來確定斑點的亮度范圍。-
SimpleBlobDetector是OpenCV中用于檢測二值圖像中的斑點的類,以下是它的參數(shù)說明:
- thresholdStep:二值化閾值步長,用于在二值化過程中逐步增加或減小閾值,默認(rèn)為10。
- minThreshold:最小的二值化閾值,默認(rèn)為50。
- maxThreshold:最大的二值化閾值,默認(rèn)為220。
- minRepeatability:最小的斑點重復(fù)次數(shù),默認(rèn)為2,表示只有當(dāng)一個斑點至少在兩個不同位置被檢測到時才會被認(rèn)為是有效的。
- blobColor:斑點的亮度值,取值為0或255,默認(rèn)為0,表示只檢測黑色斑點。
- filterByArea:是否根據(jù)斑點的面積進行過濾,默認(rèn)為true,表示進行過濾。
- minArea:最小的斑點面積,默認(rèn)為25,表示只檢測面積大于25的斑點。
- maxArea:最大的斑點面積,默認(rèn)為5000,表示只檢測面積小于5000的斑點。
- filterByCircularity:是否根據(jù)斑點的圓形度進行過濾,默認(rèn)為false,表示不進行過濾。
- minCircularity:最小的斑點圓形度,默認(rèn)為0.8,表示只檢測圓形度大于0.8的斑點。
- maxCircularity:最大的斑點圓形度,默認(rèn)為1,表示只檢測圓形度小于1的斑點。
- filterByInertia:是否根據(jù)斑點的慣性比進行過濾,默認(rèn)為true,表示進行過濾。
- minInertiaRatio:最小的斑點慣性比,默認(rèn)為0.1,表示只檢測慣性比大于0.1的斑點。
- maxInertiaRatio:最大的斑點慣性比,默認(rèn)為1,表示只檢測慣性比小于1的斑點。
- filterByConvexity:是否根據(jù)斑點的凸度進行過濾,默認(rèn)為true,表示進行過濾。
- minConvexity:最小的斑點凸度,默認(rèn)為0.95,表示只檢測凸度大于0.95的斑點。
- maxConvexity:最大的斑點凸度,默認(rèn)為1,表示只檢測凸度小于1的斑點。
// 讀取原始圖像
Mat image = new Mat("1.jpg", ImreadModes.Color);
// 創(chuàng)建SimpleBlobDetector參數(shù)
SimpleBlobDetector.Params parameters = new SimpleBlobDetector.Params();
// 設(shè)置參數(shù)
parameters.FilterByArea = true;
parameters.MinArea = 100;
parameters.MaxArea = 10000;
// 創(chuàng)建SimpleBlobDetector
SimpleBlobDetector detector = SimpleBlobDetector.Create(parameters);
// 檢測斑點
KeyPoint[] keypoints = detector.Detect(image);
// 在圖像上繪制斑點
Mat result = new Mat();
Cv2.DrawKeypoints(image, keypoints, result, Scalar.All(-1), DrawMatchesFlags.Default);
// 顯示結(jié)果
Cv2.ImShow("Result", result);
Cv2.WaitKey(0);
2)、connectedComponentsWithStats
- 使用cv2.connectedComponentsWithStats找到所有連通區(qū)域及其統(tǒng)計數(shù)據(jù)。
過濾出可能是斑點的連通區(qū)域。
using OpenCvSharp.Blob;
Cv2.Threshold(bin, binary, 90, 255, ThresholdTypes.Binary); //二值化
Mat result = new Mat(my_img3.Size(), MatType.CV_8UC3);
CvBlobs blobs = new CvBlobs();
blobs.Label(binary);//斑點檢測
blobs.RenderBlobs(my_img3, result);//渲染斑點
int text = 1; //數(shù)字
foreach (var item in blobs)
{
if ((item.Value.Area > 20)) // 檢查標(biāo)簽區(qū)域 20
{
// float xxx=item.Value.
CvBlob b = item.Value;
Cv2.Circle(result, b.Contour.StartingPoint, 8, Scalar.Red, 2, LineTypes.AntiAlias);
Cv2.PutText(result, text.ToString(), new OpenCvSharp.Point(b.Centroid.X, b.Centroid.Y), //修改標(biāo)簽編號設(shè)置
HersheyFonts.HersheyComplex, 1, Scalar.Yellow, 2, LineTypes.AntiAlias);
int ratio = 100 * b.Area / (b.Rect.Width * b.Rect.Height);
// if (b.Area / (b.Rect.Width * b.Rect.Height) > 0.4)
// {
LogHelper.WriteLog("ratio=" + ratio.ToString() + ",Area=" + b.Area.ToString() + "Width=" + b.Rect.Width.ToString() + "Height=" + b.Rect.Height.ToString());
if (ratio >= 40)
{ ZpArr[i] = 0; }
// }
text++;
}
}
2、邊緣檢測
- 邊緣檢測是一種圖像處理技術(shù),可以找到圖像中的邊緣或邊界。
OpenCV 中提供的兩種重要邊緣檢測算法:Sobel邊緣檢測和 canny邊緣檢測。
1)、cv2.Sobel()
public static void Sobel(
InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1,
double delta = 0,
BorderType borderType = BorderType.Default
)
參數(shù)說明:
- src:輸入圖像。
dst:輸出圖像,是一個與輸入圖像相同大小和類型的圖像。
ddepth:輸出圖像的深度,通常使用-1表示與輸入圖像相同深度。
dx:表示在水平方向上進行邊緣檢測的階數(shù)。
dy:表示在垂直方向上進行邊緣檢測的階數(shù)。
ksize:表示卷積核的大小,默認(rèn)為3。
scale:可選參數(shù),用于縮放結(jié)果,默認(rèn)為1。
delta:可選參數(shù),用于調(diào)整結(jié)果的偏移,默認(rèn)為0。
borderType:可選參數(shù),用于指定邊界的處理方式,默認(rèn)為BorderType.Default。 - 使用cv2.Sobel函數(shù)可以進行邊緣檢測,通過調(diào)整dx和dy的值可以獲得不同方向的邊緣信息。輸出圖像的像素值表示了對應(yīng)位置的邊緣強度。
using OpenCvSharp;
Mat srcImage = new Mat("input.jpg", ImreadModes.Color);
Mat grayImage = new Mat();
Cv2.CvtColor(srcImage, grayImage, ColorConversionCodes.BGR2GRAY);
Mat edges = new Mat();
Cv2.Sobel(grayImage, edges, MatType.CV_8U, 1, 0, 3);
Cv2.ImShow("Edges", edges);
Cv2.WaitKey(0);
- 這個示例將輸入圖像轉(zhuǎn)換為灰度圖像,并使用Sobel算子在水平方向上進行邊緣檢測,然后顯示結(jié)果圖像。
2)、cv2.Canny()
public static void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
3、輪廓檢測
- 輪廓檢測是一種從圖像中提取物體形狀的技術(shù)。
OpenCV中的cvFindContours函數(shù)可以實現(xiàn)輪廓檢測。
該函數(shù)將圖像轉(zhuǎn)換為二進制圖像,然后找到所有的輪廓。
參考
李建軍的博客:https://blog.csdn.net/hb_ljj/article/details/135038353