美文网首页
Scharr(边缘提取)

Scharr(边缘提取)

作者: itfitness | 来源:发表于2019-08-08 11:50 被阅读0次

    概念

    这个是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对象
    

    相关文章

      网友评论

          本文标题:Scharr(边缘提取)

          本文链接:https://www.haomeiwen.com/subject/psatjctx.html