日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包)

發布時間:2024/3/24 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.基本原理

? ? 邊緣檢測一般是利用微分等方法,通過對灰度躍變的分析尋找圖像上區域邊緣的技術。今天的豬腳是梯度算子和Roberts算子。

? ? 1.梯度算子是怎么來的?

? ? 答:圖像是一個二維集合,在(x, y)處的偏導數(也就是此點的最大變化率)可以寫成下圖這樣,其梯度大小本為,但由于計算量大,所以簡化成

? ? ??

? ? 2.Roberts算子是怎么來的?

? ? 答:對角線方向的梯度,其定義見下圖,這個就是Roberts算子,其梯度大小本為,但由于計算量大,所以簡化成

? ?3.Sobel算子是怎么來的?(此圖參考自https://blog.csdn.net/songzitea/article/details/17528089)

? ? 答:

?

2.代碼實現(代碼是我以前自學圖像處理時寫的,代碼很粗糙沒做任何優化,但很好理解

/*梯度法邊緣檢測 比例scale對差分結果進行縮放*/ 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對差分結果進行縮放*/ 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對差分結果進行縮放,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.參考資料

? ? 數字圖像處理——技術詳解與Visual C++實踐(左飛等著),寫代碼與寫博客的時間相差兩年,至于還參考其他的資料不,我已經忘記了,如若需要,我可以補上去

總結

以上是生活随笔為你收集整理的图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。