opencvsharp实现高精度亚像素canny搜索边 编写搜索边函数 参数设定找边的起始方向从左到右、从右到左、从上到下、从下到上、从白或黑边起
时间: 2023-07-10 20:04:35 浏览: 81
opencv 实现canny检测
始、搜索边的阈值、搜寻宽度等。以下是一个示例函数的代码:
```
public static Mat FindEdges(Mat image, int startDirection, int threshold, int searchWidth, bool searchWhite)
{
Mat edges = new Mat(image.Size(), image.Type(), new Scalar(0, 0, 0));
Mat gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);
for (int y = 0; y < image.Rows; y++)
{
for (int x = 0; x < image.Cols; x++)
{
if (startDirection == 0) //从左到右
{
if (x == 0) continue;
}
else if (startDirection == 1) //从右到左
{
if (x == image.Cols - 1) continue;
x = image.Cols - x - 1;
}
else if (startDirection == 2) //从上到下
{
if (y == 0) continue;
}
else if (startDirection == 3) //从下到上
{
if (y == image.Rows - 1) continue;
y = image.Rows - y - 1;
}
int x1 = x - searchWidth / 2;
int y1 = y - searchWidth / 2;
int x2 = x + searchWidth / 2;
int y2 = y + searchWidth / 2;
if (x1 < 0) x1 = 0;
if (y1 < 0) y1 = 0;
if (x2 >= image.Cols) x2 = image.Cols - 1;
if (y2 >= image.Rows) y2 = image.Rows - 1;
bool foundEdge = false;
int edgeValue = gray.At<byte>(y, x);
for (int i = x1; i <= x2; i++)
{
for (int j = y1; j <= y2; j++)
{
if ((i == x && j == y) || i < 0 || j < 0 || i >= image.Cols || j >= image.Rows) continue;
int pixelValue = gray.At<byte>(j, i);
if ((searchWhite && pixelValue > edgeValue + threshold) || (!searchWhite && pixelValue < edgeValue - threshold))
{
foundEdge = true;
edgeValue = pixelValue;
x = i;
y = j;
}
}
}
if (foundEdge)
{
edges.Set(y, x, new Vec3b(255, 255, 255));
}
}
}
return edges;
}
```
此函数使用了OpenCvSharp库,需要包含以下命名空间:
```
using OpenCvSharp;
using OpenCvSharp.Extensions;
```
该函数的参数含义如下:
- image:源图像。
- startDirection:搜索边的起始方向。0表示从左到右,1表示从右到左,2表示从上到下,3表示从下到上。
- threshold:搜索边的阈值。
- searchWidth:搜寻宽度。
- searchWhite:指定从白边或黑边开始搜索。
该函数的返回值为Mat类型的图像,表示搜索到的边缘。
阅读全文