C++自定义sobel求梯度
生活随笔
收集整理的這篇文章主要介紹了
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求梯度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++自定义高斯滤波器
- 下一篇: C++自定义非极大值抑制(Canny边缘