附上源码,多多指教。
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
//1、读入图片
Mat src, dst;
src = imread("Bone.jpg", 0);
//2、扩充边界以进行卷积
copyMakeBorder(src, dst, 2, 2, 2, 2, BORDER_CONSTANT, Scalar(0));
//3、Sobel梯度算子锐化
Mat image_sobel;
dst.copyTo(image_sobel);
for (int i = 2; i < src.rows - 2; i++)
{
uchar *current = dst.ptr(i);
uchar *upper = dst.ptr(i - 1);
uchar *lower = dst.ptr(i + 1);
uchar *result = image_sobel.ptr(i);
//开始遍历
for (int j = 2; j < dst.cols - 2; j++)
{
//Sobel算子卷积核:
//x方向:Mat x<<-1,-2,-1,0,0,0,1,2,1 y方向:Mat y<<-1,0,1,-2,0,2,-1,0,1
int x = lower[j - 1] + 2 * lower[j] + lower[j + 1] - upper[j - 1] - 2 * upper[j] - upper[j + 1];
int y = upper[j + 1] + 2 * current[j + 1] + lower[j + 1] - upper[j - 1] - 2 * current[j] - lower[j - 1];
result[j] = sqrt(x*x + y*y);
}
}
imshow("Src image", src);
Mat filter;
//boxFilter(image_sobel,filter, image_sobel.depth(),Size(3,3));
//GaussianBlur(image_sobel, filter, Size(13, 13), 2);
medianBlur(image_sobel, filter, 3);
imshow("Image of filter", filter);
imshow("Result image", image_sobel);
while (waitKey(0) != 'q') {};
return 0;
}
原图:
Sobel算子处理: