- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
目标:我想检测叶子图像的某些区域。我发现了我的相关问题,接近这个segment object(leaf) which is on the white paper using image processing (从白色背景中去除叶子)但我的超出了它,它旨在提取/分割叶子的患病区域。
问题:如何准确分割提取图像中叶片的病害区域。
我的尝试:
1. inRange() OpenCV 函数 - 绿色阈值,这样我就不会为非绿色区域(棕色、灰色等)设置多个 inRange 值,我希望能移除绿色;我应用了高斯模糊,在分割之前从 RGB 转换为 HSV
文件链接:
图片 1:结果: 绿色被分割了(感觉不太准确),但我仍然不知道如何提取非绿色区域(作为下一步)
图 2:结果:黑色的小圆圈被包含/被认为是绿色的,据说不应该
我是 OpenCV(以及 C++)的新手,我已经阅读了几种用于分割的技术(如聚类方法 fuzzy-c 和 k-means 等),但我无法决定对我的图像使用哪种分割技术。我还从阅读的文章中了解到,不存在可以应用于所有图像的通用分割技术。
因此,我想知道哪种技术(聚类方法?基于区域的?直方图?等)或过程最适合应用于我拥有的图像种类,以便准确地分割所述图像。
非常感谢。
最佳答案
只需尝试以下步骤
创建 mask 图像:-首先您需要为叶子创建 mask 图像,您需要进行阈值处理、找到轮廓(最大)、绘制轮廓(填充)等...还有为了消除边缘效应,您需要腐 eclipse 掩模,这会产生更好的效果。
下面的代码片段将执行上述操作
Mat thr;
Mat src=imread("image2.png",1); //Your processed image
cvtColor(src,thr,CV_BGR2GRAY);
threshold(thr,thr,180,255,THRESH_BINARY_INV);
vector< vector <Point> > contours; // Vector for storing contour
vector< Vec4i > hierarchy;
int largest_contour_index=0;
int largest_area=0;
Mat mask(src.rows,src.cols,CV_8UC1,Scalar::all(0)); //create destination image
findContours( thr.clone(), contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
{
double a=contourArea( contours[i],false); // Find the area of contour
if(a>largest_area){
largest_area=a;
largest_contour_index=i; //Store the index of largest contour
}
}
drawContours( mask,contours, largest_contour_index, Scalar(255,255,255),CV_FILLED, 8, hierarchy ); // Draw the largest contour using previously stored index.
int dilation_size = 2;
Mat element = getStructuringElement( MORPH_RECT,
Size( 2*dilation_size + 1, 2*dilation_size+1 ),
Point( dilation_size, dilation_size ) );
erode( mask, mask, element );
Extract green region:- 在这里你应该使用 hsv 颜色空间,inrange 等...正如你的问题中提到的。
Mat HSV,hsv_thr,dst;
cvtColor(src,HSV,CV_BGR2HSV);
inRange(HSV,Scalar(20,10,10),Scalar(90,255,255),hsv_thr);
bitwise_not for above image:-这里你应该使用上面创建的掩码。
bitwise_not(hsv_thr, dst, mask);
绘制病变区域:-这里您需要再次找到轮廓绘制轮廓等...
findContours( dst.clone(), contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
drawContours( src,contours, i, Scalar(0,0,255),1, 8, hierarchy );
您可以通过适当的过滤、阈值化、使用适当的 hsv 范围等来改善结果...此外,上述算法认为您的背景始终为白色,对于其他背景,您需要更改创建蒙版图像的步骤。
希望这些有用...
关于c++ - 如何分割叶图像中的感兴趣区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21950352/
我正在尝试从底层叶进程写入命名管道并从顶层进程的管道读取。 为此,我首先在顶级进程中创建 FIFO,然后使用 for 循环派生更多进程。在 for 循环中,我正在检查叶子进程,如果它是叶子,我正在写入
我需要一个XPath表达式来验证XML列表元素是否只有某种类型的节点。 例: 我需要知道列表中是否只有图像。
我想从层次结构表中获取所有叶子及其根。叶子是最低层节点,根是最顶层节点。 给定一棵树: A --B --C --D E --F --G --H 叶子是节点:C, D根是:A、E 该表如下所
尝试从嵌套数组中删除相同的 sibling (叶子)/相同的数组。 例如 $data = [ 'test' => [ 'a' => [
我可以遍历目录并只打印文件夹/目录名称,但我想排除包含其他目录的目录的文件夹名称。出于某种原因,我称其为树结构中的“最终节点”,但我很可能是在自欺欺人,这不是第一次了。 =) 在审查其他答案列表时,也
我现在经常使用 Folium,在 Python 中拥有如此易于使用的东西真的很棒。但是他们的文档严重落后,我理解。所以我有2个问题。 我在尝试获得更多标记颜色时做错了什么?这是我尝试过的:map.si
我正在尝试使用 ape 包中的 plot.phylo 命令为 R 中系统发育类型图的边缘(线)添加颜色。这个例子是一个“粉丝”类型的图,虽然我希望这个方法与“系统图类型”或其他任何东西相同。 libr
我正在尝试呈现一个 JTree 叶以具有包含可编辑 JTextArea 的 JPanel,以便用户可以输入文本并能够在添加文本时向下滚动, 并且还使用包装器来限制文本的宽度,使其向下延伸以留出更多空间
这是要修改的正确 Linux 内核代码吗?我如何进行更改以模拟 CPUID 代码以及我需要更改哪个函数。谢谢 #include #include #include #include #incl
我是一名优秀的程序员,十分优秀!