- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我使用 canny edge 算法时,它会按预期产生与粗彩色线相对的 2 条边,但我只想显示一条边,以使我的直线和曲线检测算法更简单,关于我怎样才能做到这一点?
代码如下:
bool CannyEdgeDetection(DataStructure& col)
{
Mat src, src_gray;
Mat dst, detected_edges, fin;
int WhiteCount = 0, BCount = 0;
char szFil1[32] = "ocv.bmp";
char szFil2[32] = "dst.bmp";
src = imread(szFil1);
dst = imread(szFil1);
blur( src_gray, detected_edges, Size(3,3) );
Canny( src, dst, 100, 200, 3 );
imwrite(szFil2, dst );
IplImage* img = cvLoadImage(szFil2);
int height = img->height;
int width = img->width;
int step = img->widthStep;
int channels = img->nChannels;
uchar * datau = (uchar *)img->imageData;
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
for(int k=0;k<channels;k++){
datau[i*step+j*channels+k] = 255 - datau[i*step+j*channels+k];
if (datau[i*step+j*channels+k]==0){
WhiteCount++;
col.pixel_col [i][j] = 2;
}
else{BCount++;
col.pixel_col[i][j] = 0;
}
}
}
}
cvSaveImage("img.bmp" ,img);
return 0;
}
这不是原始图像,但相似:
我要注释掉哪一部分才能在白色背景下读取黑色图像?或任何彩色图像?
bool done;
do
{
cv::morphologyEx(img, temp, cv::MORPH_OPEN, element);
cv::bitwise_not(temp, temp);
cv::bitwise_and(img, temp, temp);
cv::bitwise_or(skel, temp, skel);
cv::erode(img, img, element);
double max;
cv::minMaxLoc(img, 0, &max);
done = (max == 0);
} while (!done);
最佳答案
该过程称为骨架化
或细化
。你可以用谷歌搜索。
这是一个骨架化的简单方法
:skeletonization OpenCV In C#
下面是我将上述方法应用于您的图像时得到的输出
(Image is inverted before skeletonization because above method work for white images in black background
,与输入图像的大小写相反)。
关于c++ - Canny 边算法只需要一条边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11492533/
我有一个脚本,该脚本用于根据颜色相似性为房间的墙壁重新着色。但是我需要根据边缘检测为墙壁重新着色。 import cv2 import numpy as np import sys from PIL
我想尝试 Canny 边缘检测器,但是当我尝试开始时收到未处理的异常: canny_project.exe 中 0x00007FF97F6C8B9C 处未处理的异常:Microsoft C++ 异常:
我想从二进制 canny 边缘图像中提取轮廓。 原图为: 应用 cvCanny() 和 cvDilate() 后,我得到以下图像: 我需要将封闭框(整个蓝色框)检测为轮廓。我应用 cvFindCont
我在 OpenCV Java 中使用 Canny 边缘算法找出了边缘。我需要从这张图片中提取脊髓。 能否请您建议下一步如何仅从此图像中提取脊髓? 这是原始图像: 最佳答案 要从图像中提取特定对象,您必
我正在使用 canny 边缘检测器来检测输入图像的边缘。 在每个输入图像中,可以有两个对象(主对象和其中的另一个对象),如示例图像所示。因此,我应该在这种情况下检测两条边 我根据输入图像自动确定阈值上
我使用 OpenCV 的时间相当短,对图像执行了 Canny 边缘检测,然后还执行了膨胀以进一步将对象(在我的例子中是正方形)与背景分开。 我现在的问题是使用一种算法来识别 2D 中的可抓取区域,该算
我有一张图片,我想检测它的边缘。我发现 Canny 已经被使用了很多(我不知道我是否有比这更好的选择)。我已将值设置如下: Imgproc.Canny(img, img, 10, 100, 3,t
我正在尝试寻找图像的轮廓,在此之前我正在应用 Canny 的边缘检测器。它为不同的图像提供不同的结果。对于一张图像,它在阈值下给出完美的轮廓 - min-40 max-240,而对于其他图像,它的阈值
当我使用 canny edge 算法时,它会按预期产生与粗彩色线相对的 2 条边,但我只想显示一条边,以使我的直线和曲线检测算法更简单,关于我怎样才能做到这一点? 代码如下: bool CannyEd
当使用 Imagemagick 转换工具的 -canny 选项时,这些参数指的是什么? -canny radiusxsigma{+lower-percent}{+upper-percent} 文档 (
我正在尝试创建一个程序,该程序将检测并去除图片中的边框,目标是检测图片中的文档并将其清理... 这是我的代码: import sys import cv2 import numpy as np imp
我知道在使用 Canny 检测边缘之前对图像应用高斯模糊非常重要。我的问题是: cv2.Canny() 自己做高斯模糊还是有必要在 cv2.Canny() 之前应用 cv2.GaussianBlur(
当我在图纸上运行 cv.Canny 边缘检测器时,它会检测到数百个密集填充在阴影区域中的小边缘。我怎样才能让它停止这样做,同时仍然检测到眼睛和 Nose 等较轻的特征?我也试过模糊。 这是一个示例,与
我正在尝试在此图像上运行精明边缘检测器: 使用此代码: def edges(img): from skimage import feature img = Image.open(img
我尝试过 OpenCV 中的 cvFindContours 函数,以在 Canny-edge-decctting 后获取单独的边缘。 我的问题是如何自己做与 cvFindcontours 相同的事情。
假设 Canny 边缘检测器成功检测到图像中的边缘。然后将边缘旋转 θ,其中原始边缘上的点 (x,y)(x,y) 与旋转边缘上的点 (x′,y) 之间的关系′)(x′,y′)定义为x′ = xcosθ
我想从 canny edge map 中找到并标记端点。 我试图通过只与一个邻居查看点来自己做,但此时的结果很奇怪。 OpenCV 中有查找端点的函数吗? 来自原始 Canny 的样本: 放大示例:
我正在尝试使用 Canny 过滤器检测图像的边缘。我已经能够检测到图像,但角落不是很尖锐(以红色圆圈突出显示)。令人惊讶的是,与其他角相比,第一个角很锋利并且没有烧坏。为什么会发生这种情况以及如何避免
我有 Canny 检测到的边缘。我想提取边缘的轮廓。 我已经检查了以下帖子。 OpenCV converting Canny edges to contours . 但它没有处理复杂的形状。例如,带矩
是否可以制作Canny忽略短边还是忽略低梯度边?在我的例子中,我将卡片放在木头上,并在 canny 之后看到木结构的许多边缘 canny 函数中的两个阈值有什么用? 最佳答案 Large intens
我是一名优秀的程序员,十分优秀!