C#+OpenCV基础(十五)_图像的基础分割方法
1.C#+OpenCV学习笔记(目录)-目录2.C#+OpenCV基础(一)_加载创建复制保存图片3.C#+OpenCV基础(二)_灰度化二值化4.C#+OpenCV基础(三)_修改高宽剪切拼接缩放5.C#+OpenCV基础(四)_旋转翻转透视6.C#+OpenCV基础(五)_添加边框7.C#+OpenCV基础(六)_均值中值高斯双边滤波8.C#+OpenCV基础(七)_图像金字塔9.C#+OpenCV基础(八)_获取修改图片亮度10.C#+OpenCV基础(九)_拆分合并图层11.C#+OpenCV基础(十)_灰度变化与直方图12.C#+OpenCV基础(十一)_图片基础计算13.C#+OpenCV基础(十二)_图片形态学计算14.C#+OpenCV基础(十三)_图片白平衡矫正15.C#+OpenCV基础(十四)_绘制像素、图形、文字
16.C#+OpenCV基础(十五)_图像的基础分割方法
17.C#+OpenCV基础(十六)_识别圆、直线、斑点、轮廓18.C#+OpenCV基础(十七)_计算图片相似度19.C#+OpenCV基础(十八)_模版匹配20.C#+OpenCV进阶(一)_人体识别21.C#+OpenCV进阶(二)_文字识别22.C#+OpenCV进阶(三)_操作摄像头与视频文件23.C#+OpenCV进阶(四)_录屏24.C#+OpenCV实战(一)_图片简易角度矫正25.C#+OpenCV实战(二)_春天转秋天26.C#+OpenCV实战(三)_玉米粒计数27.C#+OpenCV实战(四)_特定钢板缺陷检测1、GrabCut人为干预分割前景
/// <summary>
/// 检测边缘并标注(GrabCut人为干预分割前景;速度比分水岭算法慢,结果准确性高)
/// </summary>
/// <param name="img">图片</param>
/// <param name="rect">前景物体矩形区域;new Rect(100, 100, 200, 200)</param>
/// <param name="dstMat">结果图片</param>
/// <param name="bgdModel">背景图</param>
/// <param name="fgdModel">前景图</param>
/// <param name="iterCount">迭代次数</param>
/// <param name="mode">初始化的模式;默认为矩形初始化</param>
public static Mat GrabCut(Mat img, Rect rect, out Mat dstMat,
out Mat bgdModel, out Mat fgdModel, int iterCount = 1, GrabCutModes mode = GrabCutModes.InitWithRect)
{
Mat dstMat1 = new Mat();
dstMat = new Mat();
bgdModel = new Mat();
fgdModel = new Mat();
Cv2.GrabCut(img, dstMat, rect, bgdModel, fgdModel, iterCount, mode);
Cv2.Compare(img, dstMat, dstMat1, CmpType.EQ);
return dstMat1;
}
2、漫水填充分割
/// <summary>
/// 检测边缘并标注(漫水填充;类似于PS的魔术棒,适合于对二值图处理)
/// </summary>
/// <param name="image">图片/结果图片</param>
///// <param name="mask">操作掩码;但是不会填充非零像素</param>
/// <param name="seedPoint">起始点</param>
/// <param name="newVal">被染色的值</param>
/// <param name="rect">设置重绘区域的最小边界矩形区域</param>
/// <param name="loDiff">最小色差值</param>
/// <param name="upDiff">最大色差值</param>
/// <param name="flags">操作标志位</param>
/// <returns></returns>
public static int FloodFill(InputOutputArray image, Point seedPoint, Scalar newVal, out Rect rect,
Scalar? loDiff = null, Scalar? upDiff = null, FloodFillFlags flags = FloodFillFlags.Link4)
=> Cv2.FloodFill(image, seedPoint, newVal, out rect, loDiff, upDiff, flags);
3、分水岭分割
/// <summary>
/// 分水岭分割
/// </summary>
/// <param name="image">图片</param>
/// <param name="markers">掩码</param>
/// <returns></returns>
public static void Watershed(InputArray image, InputOutputArray markers) => Cv2.Watershed(image, markers);
/// <summary>
/// 检测边缘并标注(分水岭分割)
/// 先在外面找边缘-比如:先图像灰度化、再滤波、再Canny边缘检测;如使用MarginDetector_Sobel或者MarginDetector_Canny
/// 再传入原始图像和边缘信息
/// </summary>
/// <param name="image">图片</param>
/// <param name="points">轮廓集合</param>
/// <param name="hierarchy">历史轮廓</param>
/// <returns></returns>
public static Mat Watershed_Draw(Mat image, Point[][] points, HierarchyIndex[] hierarchy)
{
Mat imageContours = Mat.Zeros(image.Size(), MatType.CV_8UC1); // 轮廓
Mat markers = new Mat(image.Size(), MatType.CV_32S); // 第二个参数
for (int index = 0; index < hierarchy.Length; index++)
{
Cv2.DrawContours(markers, points, index, Scalar.All(index + 1), 1, LineTypes.Link8, hierarchy);
Cv2.DrawContours(imageContours, points, index, new Scalar(255), 1, LineTypes.Link8, hierarchy);
}
// 分水岭分割
Cv2.Watershed(image, markers);
// 填充颜色
Mat perspectiveImage = new Mat(image.Size(), MatType.CV_8UC3);
for (int i = 0; i < markers.Size().Height; i++)
{
for (int j = 0; j < markers.Size().Width; j++)
{
int index = markers.At<int>(i, j);
if (index == -1)
{
perspectiveImage.At<Vec3b>(i, j) = new Vec3b(255, 255, 255);
}
else
{
perspectiveImage.At<Vec3b>(i, j) = RandomColor(index);
}
}
}
Mat wshed = new Mat();
Cv2.AddWeighted(image, 0.4, perspectiveImage, 0.6, 0, wshed);
return wshed;
}
/// <summary>
/// 随机颜色
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private static Vec3b RandomColor(int index)
{
int value = index % 255; // 0~255随机数
Random random = new Random();
byte aa = Convert.ToByte(random.Next(0, value));
byte bb = Convert.ToByte(random.Next(0, value));
byte cc = Convert.ToByte(random.Next(0, value));
return new Vec3b(aa, bb, cc);
}
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/18295551
合集:
C#+机器视觉OpenCV
分类:
C#+机器视觉OpenCV
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
2023-07-11 Element-动态控制el-table的行的显示与隐藏
2019-07-11 javascript修改css样式表