void laplaceSharpenl(){
auto im = imread("/Users/qixiangzhang/Desktop/openCV/jy.png");
Mat dst;
Mat kernel = (Mat_<float>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
filter2D(im, dst, im.depth(), kernel);
imshow("Original", im);
imshow("Sharpenl", dst);
}
结果:
标定的拉普拉斯滤波图像:
拉普拉斯滤波处理后图像中既有正值又有负值,所有负值被修剪为0,很多经过拉普拉斯滤波后的图像大部分是黑色的。典型的标定拉普拉斯图像的方法是对他的最小值加一个新的代替0的最小值。
非锐化掩蔽的处理步骤:
1)模糊原图像。
2)从原图中减去模糊的图像得到模板。
3)将模板加到原图像上。
公式描述:
代码:
void Unsharp(){
auto im = imread("/Users/qixiangzhang/Desktop/openCV/yq.png");
Mat dstIm_9;
blur(im, dstIm_9, Size(9,9));//模糊
imshow("Original",im);
imshow("blur9", dstIm_9);
Mat sub;
absdiff(im,dstIm_9,sub);//相减
Mat add;
scaleAdd(im, 1, sub, add);//相加,非锐化掩蔽
imshow("k=1",add);
scaleAdd(im, 2, sub, add);//k=2,高提升滤波
imshow("k=2",add);
}
梯度图像可理解为突出图像显著变化的地方,变化越大其梯度值越高。
图像函数f(x,y)在点(x,y)的梯度是一个具有大小和方向的矢量,设为Gx 和 Gy 分别表示x方向和y方向的梯度,这个梯度的矢量可以表示为:
这个矢量的幅度为:
近似为:
罗伯特交叉梯度算子
算子:
由两个2*2模板组成,用卷积模板表示为:
结合可得结果:
Soble算子
算子:
用上述方法可得:
其中z表示矩阵中该位置的值。
opencv接口:
CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, int ksize=3,
double scale=1, double delta=0,
int borderType=BORDER_DEFAULT );
代码
void sobleIM(){
auto src = imread("/Users/qixiangzhang/Desktop/openCV/yq.png");
imshow("1",src);
//用高斯滤波进行模糊
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
Mat grad_x,grad_y;
Mat abs_grad_x,abs_grad_y;
//计算x梯度
Sobel(src, grad_x, CV_8U, 1, 0);
convertScaleAbs( grad_x, abs_grad_x );
//计算y梯度
Sobel(src, grad_y, CV_8U, 1, 0);
convertScaleAbs( grad_y, abs_grad_y );
//相加并加权。
addWeighted( abs_grad_x, 1, abs_grad_y, 1, 0, src );
imshow("soble1",src);
addWeighted( abs_grad_x, 2, abs_grad_y, 2, 0, src );
imshow("soble2",src);
}