Android for OpenCV 边缘角点特征检测

图像特征检测对于我们分析图像序列(视频)中物体移动,旋转等状态改变有非常大的作用。OpenCV中对于图像的基本角点和边缘检测的方式分为:高斯差分,Canny边缘检测器,Sobel算子和Harris角点。

 边缘其实就是我们一副图片中像素亮度变化最明显的点:例如人脸和人脸之外的背景的像素亮度,发生改变的临界点的边界线。

  1. 高斯差分
    高斯差分是最原始的图像特征检测算法,高斯差分的原理是:
    1.把图片变成灰度图片
    2.对灰度图片进行两次不同半径的高斯模糊,得到两个特征图像
    3.将两幅高斯模糊的结果相减,得到新的特征图像
    4.反转二阀值,让灰度图片边界变亮
    代码流程如下:

           Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.gx);
            Mat matSrc = new Mat();
            Mat matGray = new Mat();
            Mat matBlur1 = new Mat();
            Mat matBlur2 = new Mat();
            Utils.bitmapToMat(bitmap,matSrc);
            Imgproc.cvtColor(matSrc,matGray,Imgproc.COLOR_BGR2GRAY);
    
            Imgproc.GaussianBlur(matGray,matBlur1,new Size(5,5),3);
            Imgproc.GaussianBlur(matGray,matBlur2,new Size(11,11),3);
    
            Mat resultMat = new Mat();
            Core.absdiff(matBlur1,matBlur2,resultMat);
            //在此Scalar 代表单通道的像素值,multiply方法就是让mat的每个像素点 和 scalar相乘
            Core.multiply(resultMat,new Scalar(100),resultMat);
            Imgproc.threshold(resultMat,resultMat,100,255,Imgproc.THRESH_BINARY_INV);
    
            Bitmap dstBitmap = Bitmap.createBitmap(resultMat.cols(),resultMat.rows(),Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(resultMat,dstBitmap);
            src.setImageBitmap(bitmap);
            dst.setImageBitmap(dstBitmap);

  2. Canny边缘检测
    Canny边缘检测是目前应用最广泛且公认的最优的边缘检测算法
    该算法大致分为四个步骤:
    1.平滑图像:这是算法的第-一步。我们通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声。
    2.计算图像的梯度:这里我们计算图像的梯度,并将梯度分类为垂直、水平和斜对角。这一步的输出被用于在下一- 步中计算真正的边缘。
    3.非最大值抑制":我们利用前一步中计算得到的梯度方向,检查某-像素在梯度的深入OpenCV Android应用开发
    正方向和负方向上是否是局部最大值,如果是,则抑制该像素( 也就是说,像素不属于边缘)。这是一种边缘细化技术,用最急剧的变换选出边缘点。
    4.用滞后阈值化选择边缘:这是算法的最后-步。我们检查某一条边缘 是否明显到足以作为最终输出,最后去除所有不够明显的边缘

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.gx);
            Mat matSrc = new Mat();
            Mat matGray = new Mat();
            Mat matEdge = new Mat();
            Utils.bitmapToMat(bitmap,matSrc);
            Imgproc.cvtColor(matSrc,matGray,Imgproc.COLOR_BGR2GRAY);
            Imgproc.Canny(matSrc,matEdge,10,100);
            Bitmap dstBitmap = Bitmap.createBitmap(matEdge.cols(),matEdge.rows(),Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(matEdge,dstBitmap);
            src.setImageBitmap(bitmap);
            dst.setImageBitmap(dstBitmap);

     

至此我们了解了两种边缘检测方式,其他的检测方式可以通过第二篇中,推荐的书籍中去了解,下一篇学习具体的形状检测-霍夫变换。

GitHub地址:https://github.com/WangRain1/OpencvDemo 

发布了119 篇原创文章 · 获赞 140 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/WangRain1/article/details/89553083
今日推荐