qt图像算法—图像的带方向边缘检测之c++实现(不调包)
【源码下载】GitCode,关键词【qt图像算法】
整套项目源码内容包含
[1].根据算法原理,编写纯c++源码,不调用外源库opencv 等;
[2].包括各种图像处理的基本算法,包含腐蚀膨胀,缩放,转置,镜像,平移,均衡变化,灰度拉升,灰度阈值,灰度非线性,转灰度,灰度线性,旋转,简单平滑,高斯平滑,轮廓跟踪,种子算法,hough直线检测,拉普拉斯,带方向边缘检测,常规边缘检测(梯度算子、Roberts算子和Sobel算子),中值滤波,反色操作等;
[3].程序中有完整的注释,便于大家很好理解代码。
1.基本原理
在边缘检测中,我们有时只想检测出某一种类型的边缘,比如成45°,如果我们以45°为区间,360°将被分成8个方向。常用作带方向边缘检测的模板有3种,分别是Prewitt、Robinson和Kirsch,图中将呈现集中常用检测水平和垂直方向边缘的模板,其中(a)为Prewitt模板,(b)为Robinson模板,(c)为Kirsch模板。

2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解)
/*八方向的Robinson模板边缘检测 比例scale对差分结果进行缩放 n为选择八方向中的一个*/
QImage* MainWindow:: SideSobeldiant(QImage* image,double scale)
{
QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);
QColor color0;
int templt[3][3] = {
{1,1,1},
{1,-2,1},
{-1,-1,-1}
};
int templt1[3][3] = {
{1,1,1},
{1,-2,-1},
{1,-1,-1}
};
int templt2[3][3] = {
{1,1,-1},
{1,-2,-1},
{1,1,-1}
};
int templt3[3][3] = {
{1,-1,-1},
{1,-2,-1},
{1,1,1}
};
int templt4[3][3] = {
{-1,-1,-1},
{1,-2,1},
{1,1,1}
};
int templt5[3][3] = {
{-1,-1,1},
{-1,-2,1},
{1,1,1}
};
int templt6[3][3] = {
{-1,1,1},
{-1,-2,1},
{-1,1,1}
};
int templt7[3][3] = {
{1,1,1},
{-1,-2,1},
{-1,-1,1}
};
int templtsize = 3;
int a =0;
for(int y = templtsize/2; y < image->height() - templtsize/2; y++)
{
for(int x = templtsize/2; x < image->width() - templtsize/2;x++)
{
int r =0;
int g = 0;
int b = 0;
for(int j = -templtsize/2; j <=templtsize/2;j++)
{
for(int i = -templtsize/2; i <= templtsize/2;i++)
{
color0 = QColor(image->pixel(x + i,y + j));
r += color0.red() * templt[i + templtsize/2][j + templtsize/2];
g += color0.green() * templt[i + templtsize/2][j + templtsize/2];
b += color0.blue() * templt[i + templtsize/2][j + templtsize/2];
}
}
r*= scale;
g*=scale;
b*=scale;
r = qBound(0,r,255);
g = qBound(0,g,255);
b = qBound(0,b,255);
newImage->setPixel(x,y,qRgb(r,g,b));
}
}
return newImage;
}
调用代码:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QImage image;;
image.load("E:/BaiduNetdiskDownload/imgeCode/Lena.bmp");
QImage* image1 = greyScale(&image);
QImage* image2 = SideSobeldiant(image1, 1);
painter.drawImage(10,10, image);
painter.drawImage(270,10,*image2);
}
运行结果:

浙公网安备 33010602011771号