概念
这个是OpenCV对于Sobel算子的强化,能够提取出一些微小的细节。
效果图对比
●源图像
●处理后图像
函数讲解
●函数原型
○c++
void Scharr( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT )
○Android
void Scharr(Mat src, Mat dst, int ddepth, int dx, int dy, double scale, double delta, int borderType)
●参数解释
○src:源图像Mat对象
○dst:目标图像Mat对象
○ddepth:图像的深度,可以为-1、CV_16S、CV_32F、CV_64F
○dx:int类型的,表示x方向的差分阶数,1或0 。
○dy:int类型的,表示y方向的差分阶数,1或0 。
○scale:Double类型的,计算可选比例因子,默认值1 。
○delta:加到输出像素的值,默认为0 。
○borderType:边界类型,默认值BORDER_DEFAULT。
函数使用
●c++中
#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/Administrator/Desktop/ic_test.jpg");//引入源图像
if (src.empty()) {
return -1;
}
imshow("src",src);//展示源图像
cvtColor(src, src, CV_BGR2GRAY);//将图像转换为灰度图像
imshow("gray", src);//展示灰度图像
Mat scharrX,scharrY, dst;
Scharr(src,scharrX,-1,1,0,3);//提取X方向的边缘
Scharr(src, scharrY, -1, 0, 1, 3);//提取Y方向的边缘
imshow("scharrX",scharrX);//展示X方向的边缘
imshow("scharrY", scharrY);//展示Y方向的边缘
add(scharrX,scharrY,dst);//将XY方向提取的边缘合并到一起
imshow("dst", dst);//展示最终结果
waitKey(0);
return 0;
}
●Android中
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_relief);
Mat src = new Mat();
Mat dst = new Mat();
Mat scharrX = new Mat();
Mat scharrY = new Mat();
Utils.bitmapToMat(bitmap,src);//将Bitmap对象转换为Mat对象
Imgproc.cvtColor(src,src,Imgproc.COLOR_RGBA2GRAY);//将图像转换为灰度图像
Imgproc.Scharr(src,scharrX, -1,1,1);//提取X方向的边缘
Imgproc.Scharr(src,scharrY, -1,0,1);//提取Y方向的边缘
Core.add(scharrX,scharrY,dst);//将XY方向提取的边缘合并到一起
//dst.convertTo(dst,CvType.CV_8UC1);//注意如果上面的ddepth参数填写了其他类型如CV_16S则需要此操作将类型转换为CV_8UC1或者CV_8UC3或CV_8UC4才能转换为Bitmap
Utils.matToBitmap(dst,bitmap);//将Mat对象转换为Bitmap对象
网友评论