卷积算法是个很神奇的东西,至今我都没搞明白它的作用,不过这也并不影响我们学习它的算法实现。本文提供C#与EmguCV实现卷积算法的源码,其过程主要是遍历像素点,然后与卷积核计算并将结果赋值给对应位置。
卷积算法
数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。
因此,卷积核要有中心点,其边长要是奇数。
C#实现代码
卷积算法
复制
private Image<Bgr, byte> Juanji(Image<Bgr, byte> pic, double[,] h) { Image<Bgr, byte> output = new Image<Bgr, byte>(pic.Size); double b = 0, g = 0, r = 0; for (int i=1;i<pic.Width-1;i++) { for(int j = 1; j < pic.Height-1; j++) { b = 0;g = 0;r = 0; for(int m = -1; m <= 1; m++) { for(int n = -1; n <= 1; n++) { b += pic[j+m, i+n].Blue * h[m + 1, n + 1]; g += pic[j + m, i + n].Green * h[m + 1, n + 1]; r += pic[j + m, i + n].Red * h[m + 1, n + 1]; } } output[j, i] = new Bgr(b,g,r); } } return output; }
这个卷积算法是对RGB图像进行计算的,如果你要对灰度图像计算,可以参考下,灰度图像的像素值都一样,应该更简单,在实现前你可能需要先了解灰度算法。C#GRB图转灰度图算法
读入图像
复制
OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { image = new Image<Bgr, byte>(ofd.FileName);//从文件加载图片 imageBox1.Image = image;//显示图片 }
使用卷积
复制
double[,] h = { { -1, -1, 0 }, { -1, 0, 1 }, { 0, 1, 1 } }; imageBox1.Image = Juanji(image,h);
h是卷积核,这里是3×3的二维数组,你可以自行修改卷积核。
EmguCV的使用我这里就不提了,自己看前面的文章。
评论 (0)