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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++自定义sobel求梯度

發布時間:2023/12/20 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++自定义sobel求梯度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Mat Sobel_gradient(Mat img, int direction) {Mat oriImage = img;Mat newImage_x = Mat(img.size(), CV_8UC1, Scalar(0));Mat newImage_y = Mat(img.size(), CV_8UC1, Scalar(0));Mat newImage_xy = Mat(img.size(), CV_8UC1, Scalar(0));int this_direction = direction;//對x方向求Sobel算子梯度int width = img.cols;int hight = img.rows;int max_sobel_x = 0;//記錄最大x方向梯度值for(int i = 1;i<hight-1;i++)for (int j = 1; j < width - 1; j++){int nav_value = oriImage.at<uchar>(i + 1, j - 1) + 2 * oriImage.at<uchar>(i, j - 1)+ oriImage.at<uchar>(i - 1, j - 1);int pos_value = oriImage.at<uchar>(i + 1, j + 1) + 2 * oriImage.at<uchar>(i, j + 1) + oriImage.at<uchar>(i - 1, j + 1);int sobel_result = (abs(pos_value - nav_value) / 6);//相減取絕對值除以6//int sobel_result = (pos_value + 6 * 255 - nav_value) / (6 * 2); //把像素加255 再除以 2if (max_sobel_x < sobel_result)max_sobel_x = sobel_result;newImage_x.at<uchar>(i, j) = sobel_result;}float mulit_x = (float)255 / max_sobel_x;//按倍數擴大像素值,使像素差距放大for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){newImage_x.at<uchar>(i, j) = newImage_x.at<uchar>(i, j) * mulit_x;}//對y方向求Sobel梯度int max_sobel_y = 0;//記錄最大y方向梯度值for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){int nav_value = oriImage.at<uchar>(i - 1, j - 1) + 2 * oriImage.at<uchar>(i -1, j )+ oriImage.at<uchar>(i - 1, j + 1);int pos_value = oriImage.at<uchar>(i + 1, j - 1) + 2 * oriImage.at<uchar>(i + 1, j )+ oriImage.at<uchar>(i + 1, j + 1);int sobel_result = (abs(pos_value - nav_value) / 6);//相減取絕對值除以6//int sobel_result = (pos_value + 6 * 255 - nav_value) / (6 * 2); //把像素加255 再除以 2if (sobel_result > max_sobel_y)max_sobel_y = sobel_result;//找到梯度最大值newImage_y.at<uchar>(i, j) = sobel_result;}float mulit_y = (float)255 / max_sobel_y;//按倍數擴大像素值,使像素差距放大for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){newImage_y.at<uchar>(i, j) = newImage_y.at<uchar>(i, j) * mulit_y;}//判斷返回類型if (this_direction == 1){return newImage_x;}else if (this_direction == 2){return newImage_y;}else {for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){newImage_xy.at<uchar>(i,j) = (newImage_x.at<uchar>(i, j) + newImage_y.at<uchar>(i, j)) / 2;}return newImage_xy;} }

總結

以上是生活随笔為你收集整理的C++自定义sobel求梯度的全部內容,希望文章能夠幫你解決所遇到的問題。

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