Scharr(边缘提取)

2019-08-08  本文已影响0人  itfitness

概念

这个是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对象
上一篇下一篇

猜你喜欢

热点阅读