
数字图像处理
还是叫明
这个作者很懒,什么都没留下…
展开
-
基于OpenCvSharp的数字图像处理 - 轮廓
我们在前面的章节里讲过边缘检测,本章所说的轮廓是基于边缘检测的。我们之前所做的边缘检测,结果只是基于像素的,而很多时候,我们可能需要对轮廓进行一些几何操作,例如分析区域是否连通,求出轮廓的凸包,判断一个点是不是在轮廓内,等等。我们先来看两种生成轮廓的方法,再看对轮廓的一些应用。一、从边缘得到轮廓虽然轮廓似乎就是边缘,但实际上,OpenCV只能从二值图得到轮廓,边缘被看成是非常窄的区域(宽1个像素)。所以,从边缘得到轮廓时,会出现两条轮廓基本相同,它们是边缘的内外。示例代码如下:Mat sr原创 2020-05-11 15:41:24 · 5092 阅读 · 1 评论 -
基于OpenCvSharp的数字图像处理 - 图像分割
图像分割是根据图像中各部分的特征,分割出不同的区域,这些区域可能代表了不同的物体。最简单的图像分割是区分出背景和前景。图像分割目前有一些比较成熟的技术,但想不通过一些辅助手段而达到比较好的分割效果,还是有一定难度的。一、漫水填充如果用过Photoshop的读者,应该对这项功能很熟悉。先设定一个阈值,然后在图像中的某个区域点一下鼠标,类似这个区域的像素都会被填充为某一颜色。这项功能需要我们指...原创 2020-05-06 16:37:39 · 4942 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 图像优化
在直方图一章里提到的直方图均衡化就是一种图像优化的方法。本章再介绍图像修复和去噪两种方法。一、图像修复这里所介绍的图像修复是很简单的,就是用周边区域的像素填充损坏区域。代码如下:Mat src = new Mat(img_lenna_bad);//找出损坏区域Mat mask = new Mat(src.Size(), MatType.CV_8UC1, new Scalar(0...原创 2020-04-27 10:30:51 · 3045 阅读 · 3 评论 -
基于OpenCvSharp的数字图像处理 - 霍夫变换
霍夫变换最大的作用是检测图像中的直线。其原理是这样的:假设图像中有一条直线,其方程为y=kx+b。直线上有一个点,其坐标为(x1,y1)。显然,y1=kx1+b。如果我们把x、y看成是已知的,把k、b看成是未知数,有:b=-x1k+y1。我们发现,(x,y)坐标系上的一个点,对应了(k,b)坐标系上的一条直线。如果有另外一个点(x2,y2),则其必然对应(k,b)坐标系上的另一条直线。显然,(k,...原创 2020-04-27 09:16:41 · 1677 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 直方图
直方图是对图像灰度信息的一个统计结果,直方图的分布能够反映图像的某些特征,可用于图像匹配。一、直方图提取图像直方图的代码如下:Mat src = new Mat(img_lenna, ImreadModes.Grayscale);Mat hist = new Mat();Cv2.CalcHist(new Mat[] { src }, new int[] { 0 }, new Ma...原创 2020-04-26 20:18:40 · 3553 阅读 · 3 评论 -
基于OpenCvSharp的数字图像处理 - 位置变换
平移、旋转、缩放、翻转、剪切等变换都属于仿射变换,而仿射变换又是透视变换的一种。所有仿射变换都可以用三个点到另外三个点去描述,而透视变换需要四个点。我们拍摄的图像里面,一般矩形的物体(例如纸张)都会变形,如果要转回规整的矩形,就要使用透视变换。在本教程中,使用的原图都是:一、翻转Mat src = new Mat(img_word);Mat map_x = new Mat...原创 2020-04-15 14:18:38 · 2659 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 形态学
一、腐蚀形态学的内部算法依然是卷积,跟中值滤波一样,非线性。中值滤波取核范围的中位数,而腐蚀取最小值,膨胀取最大值。腐蚀看起来的效果是亮的区域被侵蚀,可用于一些噪声的去除。Mat src = new Mat(img_region, ImreadModes.Grayscale);Mat result = new Mat();Mat element = Cv2.GetStructur...原创 2020-04-15 09:07:29 · 2500 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 二值化
一、二值化方法在OpenCvSharp,threshold函数专门用来对灰度图像进行二值化。给定一个阈值thresh,最大值maxval,函数在不同的二值化类型下,功能表现如下表所示:类型 >thresh <=thresh THRESH_BINARY maxval 0 THRESH_BINARY_INV 0 maxval THRE...原创 2020-04-14 16:24:08 · 7294 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 锐化、边缘检测
一、Sobel算子Sobel算子是一阶导数的近似,分横向求导和纵向求导,其3阶算子为:实际运用时,我们可以把两次求导的结果按一定比例结合在一起。Mat src = new Mat(img_lenna, ImreadModes.Grayscale);Mat grad_x = new Mat();Mat grad_x2 = new Mat();Cv2.Sobel(src, g...原创 2020-04-14 15:20:03 · 4588 阅读 · 1 评论 -
基于OpenCvSharp的数字图像处理 - 模糊、平滑、去噪
这一章的模糊处理,以及下一章的锐化处理,其实绝大部分都是用一个核跟图像做卷积,使用的核不一样,效果就不一样。一、均值滤波均值滤波使用的核是全1核,再归一化。如五阶核:Mat src = new Mat(img_lenna, ImreadModes.Grayscale);Mat result = new Mat();Cv2.Blur(src, result, new OpenC...原创 2020-04-14 14:02:47 · 6199 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 图像彩色类型转换
在计算机上存储的图像一般使用RGB彩色空间,但是在其他场合,我们可能需要其他的彩色空间。例如,在打印时,一般使用CMYK;在很多图像处理里,我们只需要用到图像的灰度信息,需要把图像转为灰度图;HSV空间是人眼更好理解的一个彩色空间,等等。一、转为灰度图Mat src = new Mat(img_lenna);Mat result = src.CvtColor(ColorConversi...原创 2020-04-14 10:44:06 · 3860 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 像素操作
在OpenCvSharp里面,图像一般使用Mat对象存储。Mat即矩阵,矩阵的每一项是一个MatType结构。MatType有CV_16SC4、CV_8UC3、CV_8UC1等,可以看到,类型皆由四部分组成,定义如下:8 U C 3 每通道的字节数 每通道的数据类型 固定为C,指Channel 通道数 例如,一般的无透明彩色图,每一格像素包含了RGB...原创 2020-04-14 10:34:59 · 3077 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 文件与显示
一、读写文件Mat src = new Mat(img_lenna);//默认是彩色图像//Mat src = new Mat(img_lenna, ImreadModes.Grayscale);//如果需要灰度图像src.SaveImage(img_result);二、显示图像在WPF项目里面,需要使用WriteableBitmap,直接作为Image的Source。在Ope...原创 2020-04-14 10:24:27 · 1664 阅读 · 0 评论 -
基于OpenCvSharp的数字图像处理 - 创建项目
OpenCV是一个不错的数字图像处理库,但它原生的开发语言是C++。要在C#项目里使用,需要经过一些转换。OpenCvSharp是一个不错的封装,接口跟OpenCV保持得很好。本教程的示例项目使用Visual Studio 2019开发,是一个WPF项目。1、创建一个WPF项目,.NET Framework版本选择4.6.1。2、Nuget程序包添加OpenCvSharp相关库。...原创 2020-04-14 09:35:18 · 1629 阅读 · 1 评论