OpenCvSharp工作学习笔记4

整理一下自己的学习思路:目前跟着haixin-561 大佬的博文学习下来,补充OpenCVSharp入门教程中的一些知识,更多在实践中学习。

1.图像间处理

图像之间的操作可以理解成两个矩阵之间的操作,两个矩阵进行(带权重)加运算,乘运算要求两个图片的size和channel个数相等。

图像相加的用途:

1.消除噪声:由于图像各点的采集噪声是互不相关的,且噪声具有零均值的统计特性,因此可以对图像进行多次采集形成多副图像,然后将这多副图像相加再取平均值,就可以实现噪点的消除

2.图像叠加

参考:OpenCV-Python图像的加法运算cv2.add函数详解

1.1 Cv2.Add()

public static void Add(InputArray src1, InputArray src2, OutputArray dst, InputArray? mask = null, int dtype = -1)
//mask和dtype参数有默认值,这里先不深究

1.2 Cv2.ScaleAdd() 

public static void ScaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst)
//其中dst = alpha*src1 + beta*src2 + gamma

如果MAT1和MAT2的上述属性不等,就会报如下错误。 

OpenCvSharp.OpenCVException:“The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array'”

 1.3 Cv2.Multiply

public static void Multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1.0, int dtype = -1)

2.高斯模糊算法

Gaussian Blur,高斯模糊。减少图像噪声以及降低细节层次
高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果。 从数学的角度来看,图像的高斯模糊过程就是图像与正态分布(高斯分布)做卷积。

G(u,v)=\frac{1}{2\pi \sigma ^{2}}\cdot e^{\frac{-(u^{2}+v^{2})}{2\sigma ^{2}}}      r表示模糊半径,sigma为正太分布的标准差

高斯分布理解:中心点取周围点的均值,进行平滑化,视觉上展现为模糊化,失去细节。

OpenCvSharp工作学习笔记4_第1张图片        OpenCvSharp工作学习笔记4_第2张图片(高斯模糊处理后)

        private void Form1_Load(object sender, EventArgs e)
        {
            Mat src1 = new Mat(@"C:\Users\Dennis\Desktop\3.png",ImreadModes.AnyDepth|ImreadModes.AnyColor);
            Mat dst1 = new Mat();
            Mat dst2 = new Mat();
            OpenCvSharp.Size ksize = new OpenCvSharp.Size(5,5);
            OpenCvSharp.Point anchor = new OpenCvSharp.Point(3, 3);
            BorderTypes borderType = BorderTypes.Constant;
            Cv2.Blur(src1, dst1, ksize, anchor, borderType);
            Cv2.GaussianBlur(src1, dst2, ksize, 0);
            new Window("src", src1);
            new Window("模糊", dst1);
            using(new Window("高斯模糊", dst2))
            {
                Cv2.WaitKey(0);
            }
        }

高斯模糊理解:

public static void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0.0, BorderTypes borderType = BorderTypes.Reflect101)
//ksize表示高斯内核大小,ksize.width和ksize.height必须是正奇数,两者可以不相同,值越大越模糊
//sigmaX,sigmaY分别表示X和Y轴的标准差,值越大越模糊

 3.Canny边缘检测算法

Canny边缘检测算子是一种多级检测算法。1986年由John F. Canny提出,同时提出了边缘检测的三大准则:

1.低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检和误检。

2.最优定位:检测的边缘点应该精确地定位于边缘的中心。

3.图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘。

 通过hScrollBar来控制上下阈值,从而实现动态调节并展示实时的效果

        private void hScrollBar1_Scroll_1(object sender, ScrollEventArgs e)
        {
            thresholdLabel1.Text = hScrollBar1.Value.ToString();
            CannyButton_Click(sender, e);
        }

        private void hScrollBar2_Scroll(object sender, ScrollEventArgs e)
        {
            thresholdLabel2.Text = hScrollBar2.Value.ToString();
            CannyButton_Click(sender, e);
        }
        private void CannyButton_Click(object sender, EventArgs e)
        {
            if(src.Empty())
            {
                PrintMsg("请先选择图片",Color.Red);
                return;
            }
            double threshold1 = hScrollBar1.Value;
            double threshold2 = hScrollBar2.Value;
            int apertureSize = 3;
            Cv2.Canny(src,dst,threshold1,threshold2,apertureSize);
            pictureBoxSrc.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);
            pictureBoxDst.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dst);
        }

这里有一点要注意一下, BitmapConverter.ToBitmap(Mat)方法需要添加引用OpenCvSharp.Extensions,通过Nuget搜索导入即可。这里用到的是将Mat->Bitmap方法。

 OpenCvSharp工作学习笔记4_第3张图片

OpenCvSharp工作学习笔记4_第4张图片

这里对于Canny算法还没理解透彻,threshold阈值不是很懂,进而查找资料继续学习Canny算法。

3.1Canny算法过程

  1. 应用高斯滤波来平滑图像,目的是去除噪声
  2. 找寻图像的强度梯度(intensity gradients)
  3. 应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)
  4. 应用双阈值的方法来决定可能的(潜在的)边界
  5. 利用滞后技术来跟踪边界

threshold1表示滞后过程的第一个阈值,下限,如果低于下限,则被舍弃掉

threshold2表示滞后过程的第二个阈值,上限,如果高于上限,则认为是边缘像素。如果在两个阈值之间,且跟边缘像素相连才会被接受。

apertureSize表示Sobel计算用的孔径大小,默认为3

OpenCvSharp工作学习笔记4_第5张图片

参考:OpenCVSharp入门教程 基础篇⑥——Canny边缘检测算法_小康师兄 

你可能感兴趣的:(opencvsharp,opencv,计算机视觉)