基于OpenCvSharp的数字图像处理

您所在的位置:网站首页 OpenCVSharp提取字符 基于OpenCvSharp的数字图像处理

基于OpenCvSharp的数字图像处理

2024-03-03 08:25| 来源: 网络整理| 查看: 265

创建项目  |  文件与显示  |  像素操作  |  图像彩色类型转换  |  模糊、平滑、去噪  |  锐化、边缘检测  |  二值化  |  形态学  |  位置变换  |  直方图  |  霍夫变换  |  图像优化  |  图像分割

完整示例项目

 

图像分割是根据图像中各部分的特征,分割出不同的区域,这些区域可能代表了不同的物体。最简单的图像分割是区分出背景和前景。图像分割目前有一些比较成熟的技术,但想不通过一些辅助手段而达到比较好的分割效果,还是有一定难度的。

一、漫水填充

如果用过Photoshop的读者,应该对这项功能很熟悉。先设定一个阈值,然后在图像中的某个区域点一下鼠标,类似这个区域的像素都会被填充为某一颜色。这项功能需要我们指出ROI大概在哪里,还要指出阈值使用多少。示例代码如下:

Mat src = new Mat(img_desk); Cv2.FloodFill(src, new OpenCvSharp.Point(233, 102), new Scalar(0, 0, 255), out OpenCvSharp.Rect rect, new Scalar(30, 30, 30), new Scalar(30, 30, 30)); src.SaveImage(img_result);

效果如下:

注:目标点在键盘的Space键里。

二、分水岭算法

分水岭算法要求我们指出图像中的哪些区域是连通的。给定一个跟图像相同大小的矩阵,连通区域使用同一数字表示,例如上图,笔记本区域标记为1,键盘区域标记为2等。这些区域只需要模糊标记(如果我们能准确标记,那就不需要这个算法做什么事了)。

示例代码如下:

Mat src = new Mat(img_desk); Mat marker = new Mat(src.Rows, src.Cols, MatType.CV_32SC1); for (int i = 0; i < 154; i++) { for (int j = 0; j < 91; j++) { marker.Set(40 + j, 45 + i, 1); } } for (int i = 0; i < 110; i++) { for (int j = 0; j < 234; j++) { marker.Set(176 + j, 369 + i, 2); } } for (int i = 0; i < 30; i++) { for (int j = 0; j < 30; j++) { marker.Set(194 + j, 191 + i, 3); } } Cv2.Watershed(src, marker); Mat result = new Mat(marker.Rows, marker.Cols, MatType.CV_8UC3); for (int i = 0; i < marker.Width; i++) { for (int j = 0; j < marker.Height; j++) { byte v = marker.Get(j, i); switch (v) { case 1: result.Set(j, i, new Vec3b(255, 0, 0)); break; case 2: result.Set(j, i, new Vec3b(0, 255, 0)); break; case 3: result.Set(j, i, new Vec3b(0, 0, 255)); break; } } } result.SaveImage(img_result);

效果如下:

三、Grabcuts算法

Grabcuts算法利用标记区域的直方图特征,寻找相似的区域。标记区域需要为矩形。

示例代码如下:

Mat src = new Mat(img_desk); Mat mask = new Mat(); Mat bgdModel = new Mat(); Mat fgdModel = new Mat(); Cv2.GrabCut(src, mask, new OpenCvSharp.Rect(90, 290, 180, 187), bgdModel, fgdModel, 12, GrabCutModes.InitWithRect); Mat result = new Mat(mask.Rows, mask.Cols, MatType.CV_8UC1); for (int i = 0; i < mask.Width; i++) { for (int j = 0; j < mask.Height; j++) { byte v = mask.Get(j, i); switch (v) { case 0: result.Set(j, i, 0); break; case 1: result.Set(j, i, 255); break; case 2: result.Set(j, i, 50); break; case 3: result.Set(j, i, 200); break; } } } result.SaveImage(img_result);

效果如下:

注:灰色区域是标记的,白色区域是找出来的线球。

四、Mean-Shift算法

Mean-Shift算法是本文唯一一个不需要事先标记区域的算法。它根据图像颜色空间分布的特征进行分割。

示例代码如下:

Mat src = new Mat(img_desk); Mat result = new Mat(); Cv2.PyrMeanShiftFiltering(src, result, 5, 50); result.SaveImage(img_result);

效果如下:

注:可以看到,笔记本和按键能够被分割出来。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3