图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包)
生活随笔
收集整理的這篇文章主要介紹了
图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.基本原理
? ? 邊緣檢測一般是利用微分等方法,通過對灰度躍變的分析尋找圖像上區(qū)域邊緣的技術(shù)。今天的豬腳是梯度算子和Roberts算子。
? ? 1.梯度算子是怎么來的?
? ? 答:圖像是一個二維集合,在(x, y)處的偏導(dǎo)數(shù)(也就是此點(diǎn)的最大變化率)可以寫成下圖這樣,其梯度大小本為,但由于計(jì)算量大,所以簡化成
? ? ??
? ? 2.Roberts算子是怎么來的?
? ? 答:對角線方向的梯度,其定義見下圖,這個就是Roberts算子,其梯度大小本為,但由于計(jì)算量大,所以簡化成
? ?3.Sobel算子是怎么來的?(此圖參考自https://blog.csdn.net/songzitea/article/details/17528089)
? ? 答:
?
2.代碼實(shí)現(xiàn)(代碼是我以前自學(xué)圖像處理時寫的,代碼很粗糙沒做任何優(yōu)化,但很好理解)
/*梯度法邊緣檢測 比例scale對差分結(jié)果進(jìn)行縮放*/ QImage* MainWindow:: SideGrandiant(QImage* image,double scale) {QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);QColor color0;QColor color1;QColor color2;int r = 0;int g = 0;int b = 0;int rgb = 0;int r1 = 0;int g1 = 0;int b1 = 0;int rgb1 = 0;int a = 0;for( int y = 0; y < image->height() - 1; y++){for(int x = 0; x < image->width() - 1; x++){color0 = QColor ( image->pixel(x,y));color1 = QColor ( image->pixel(x + 1,y));color2 = QColor ( image->pixel(x,y + 1));r = abs(color0.red() - color1.red());g = abs(color0.green() - color1.green());b = abs(color0.blue() - color1.blue());rgb = r + g + b;r1 = abs(color0.red() - color2.red());g1= abs(color0.green() - color2.green());b1 = abs(color0.blue() - color2.blue());rgb1 = r1 + g1 + b1;a = rgb + rgb1;a = a * scale;a = a>255?255:a;newImage->setPixel(x,y,qRgb(a,a,a));}}return newImage; }/*Roberts法邊緣檢測 比例scale對差分結(jié)果進(jìn)行縮放*/ QImage* MainWindow:: SideRobertsdiant(QImage* image,double scale) {QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);QColor color0;QColor color1;QColor color2;QColor color3;int r = 0;int g = 0;int b = 0;int rgb = 0;int r1 = 0;int g1 = 0;int b1 = 0;int rgb1 = 0;int a = 0;for( int y = 0; y < image->height() - 1; y++){for(int x = 0; x < image->width() - 1; x++){color0 = QColor ( image->pixel(x,y));color1 = QColor ( image->pixel(x + 1,y));color2 = QColor ( image->pixel(x,y + 1));color3 = QColor ( image->pixel(x + 1,y + 1));r = abs(color0.red() - color3.red());g = abs(color0.green() - color3.green());b = abs(color0.blue() - color3.blue());rgb = r + g + b;r1 = abs(color1.red() - color2.red());g1= abs(color1.green() - color2.green());b1 = abs(color1.blue() - color2.blue());rgb1 = r1 + g1 + b1;a = rgb + rgb1;a = a * scale;a = a>255?255:a;newImage->setPixel(x,y,qRgb(a,a,a));}}return newImage; }/*sobel法邊緣檢測 比例scale對差分結(jié)果進(jìn)行縮放,type表示使用那種公式 取值0或則1*/ QImage* MainWindow:: SideSobeldiant(QImage* image,double scale,int type) {QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);QColor color0;QColor color1;QColor color2;QColor color3;QColor color4;QColor color5;QColor color6;QColor color7;QColor color8;int r = 0;int g = 0;int b = 0;int rgb = 0;int r1 = 0;int g1 = 0;int b1 = 0;int rgb1 = 0;int a = 0;for( int y = 1; y < image->height() - 1; y++){for(int x = 1; x < image->width() - 1; x++){color0 = QColor ( image->pixel(x,y));color1= QColor ( image->pixel(x-1,y-1));color2 = QColor ( image->pixel(x,y-1));color3 = QColor ( image->pixel(x+1,y));color4 = QColor ( image->pixel(x-1,y));color5 = QColor ( image->pixel(x+1,y));color6 = QColor ( image->pixel(x-1,y+1));color7= QColor ( image->pixel(x,y+1));color8 = QColor ( image->pixel(x+1,y+1));r = abs(color1.red() + color2.red() * 2 + color3.red() - color6.red() - color7.red() * 2 - color8.red());g = abs(color1.green() + color2.green() * 2 + color3.green() - color6.green() - color7.green() * 2 - color8.green());b = abs(color1.blue() + color2.blue() * 2 + color3.blue() - color6.blue() - color7.blue() * 2 - color8.blue());rgb = r + g + b;r1 = abs(color1.red() + color4.red() * 2 + color6.red() - color3.red() - color5.red() * 2 - color8.red());g1= abs(color1.green() + color4.green() * 2 + color6.green() - color3.green() - color5.green() * 2 - color8.green());b1 = abs(color1.blue() + color4.blue() * 2 + color6.blue() - color3.blue() - color5.blue() * 2 - color8.blue());rgb1 = r1 + g1 + b1;if(type == 0){if (rgb > rgb1)a = rgb;elsea = rgb1;}else if(type == 1){a = (rgb + rgb1)/2;}a = a * scale;a = a>255?255:a;newImage->setPixel(x,y,qRgb(a,a,a));}}return newImage; }3.參考資料:
? ? 數(shù)字圖像處理——技術(shù)詳解與Visual C++實(shí)踐(左飛等著),寫代碼與寫博客的時間相差兩年,至于還參考其他的資料不,我已經(jīng)忘記了,如若需要,我可以補(bǔ)上去
總結(jié)
以上是生活随笔為你收集整理的图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于创建奇门自定义api接口流程备忘录
- 下一篇: 云里黑白第七回——Dell戴尔G3 35