OpenCVForUnity边缘检测(梯度)与滤波

OpenCV中,和边缘检测相关的算子有索贝尔,拉普拉斯滤波,Canny,Scharr等,另外还有一些解决特定问题的算子。这次的实例,尝试使用多种算子,对图片进行边缘提取。

public class gradient : MonoBehaviour
{
    [SerializeField] private Image sobelImage, laplaceImage, cannyImage;
    Mat grayMat = new Mat();
    Mat dstMat = new Mat();

    void Start()
    {
        grayMat = Imgcodecs.imread(Application.dataPath + "/Textures/kizuna.jpg", 0); //读取为灰度

        sobelImage.sprite = SobelGradient();
        sobelImage.preserveAspect = true;

        laplaceImage.sprite = LaplaceGradient();
        laplaceImage.preserveAspect = true;

        cannyImage.sprite = CannyGradient();
        cannyImage.preserveAspect = true;
    }

    //索贝尔滤波
    public Sprite SobelGradient()
    {
        Mat grad_x = new Mat();
        Mat grad_y = new Mat();
        Mat abs_grad_x = new Mat();
        Mat abs_grad_y = new Mat();

        // 计算水平方向梯度
        Imgproc.Sobel(grayMat, grad_x, CvType.CV_16S, 1, 0, 3, 1, 0);
        // 计算垂直方向梯度
        Imgproc.Sobel(grayMat, grad_y, CvType.CV_16S, 0, 1, 3, 1, 0);
        // 计算两个方向上的梯度的绝对值
        Core.convertScaleAbs(grad_x, abs_grad_x);
        Core.convertScaleAbs(grad_y, abs_grad_y);
        // 计算结果梯度
        Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 1, dstMat);

        // Mat转Texture2D
        Texture2D t2d = new Texture2D(dstMat.cols(), dstMat.rows());
        Utils.matToTexture2D(dstMat, t2d);
        Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero);
        return sp;
    }

    //拉普拉斯滤波
    public Sprite LaplaceGradient()
    {
        Mat dst = new Mat();
        int scale = 1;
        int delta = 0;
        int ddepth = CvType.CV_16S;
        int kernel_size = 3;

        Imgproc.Laplacian(grayMat, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT);
        Core.convertScaleAbs(dst, dstMat);

        // Mat转Texture2D
        Texture2D t2d = new Texture2D(dstMat.cols(), dstMat.rows());
        Utils.matToTexture2D(dstMat, t2d);
        Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero);
        return sp;
    }

    //Canny滤波
    public Sprite CannyGradient()
    {
        Mat edge = new Mat();
        double threshold1 = 0;
        double threshold2 = 100;

        Imgproc.blur(grayMat, edge, new Size(3, 3));
        Imgproc.Canny(edge, edge, threshold1, threshold2);
        Core.convertScaleAbs(edge, dstMat);

        // Mat转Texture2D
        Texture2D t2d = new Texture2D(dstMat.cols(), dstMat.rows());
        Utils.matToTexture2D(dstMat, t2d);
        Sprite sp = Sprite.Create(t2d, new UnityEngine.Rect(0, 0, t2d.width, t2d.height), Vector2.zero);
        return sp;
    }
}

最终效果

边缘提取

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值