Android OpenCV之基于均值实现图像二值分割

Posted 码上夏雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OpenCV之基于均值实现图像二值分割相关的知识,希望对你有一定的参考价值。

android OpenCV之基于均值实现图像二值分割

均值与标准方差

对于给定的数据,它的均值 u u u s t d d e v stddev stddev计算如下:
u = ∑ i = 0 n x i n u = \\frac\\sum_i = 0^n x_in u=ni=0nxi
其中 n n n表示数据的长度、 x i x_i xi表示第 i i i个元素的值。
s t d d e v = ∑ i = 0 n ( x i − u ) 2 n − 1 stddev=\\sqrt\\frac\\sum_i = 0^n (x_i-u)^2n-1 stddev=n1i=0n(xiu)2
其中 n n n表示数据的长度、 u u u表示均值、1表示自由度

OpenCV API

针对均值与标准方差,OpenCV已经在Core模块中为我们实现了这类API,具体声明如下:

meanStdDev(Mat src, MatOfDouble mean, MatOfDouble stddev)

src 表示输入的 Mat 对象。
mean 计算出的各个通道的均值,数组长度和 src 的通道数一致。
stddev 计算出的各个通道的标准方差,数组长度和 src 的通道数一致。

基于均值实现图像二值分割的代码如下

/**
 * 将[srcMat]转换为灰度图像
 *
 * @param srcMat Mat数据源
 * @return 转换后的灰度Mat
 */
fun convertMat2GrayMat(srcMat: Mat): Mat 
    // 转为灰度图像
    val gray = Mat()
    Imgproc.cvtColor(srcMat, gray, Imgproc.COLOR_BGR2GRAY)

    // 计算均值和标准方差
    val means = MatOfDouble()
    val stddevs = MatOfDouble()
    Core.meanStdDev(gray, means, stddevs)

    // 读取像素数组
    val width = gray.cols()
    val height = gray.rows()
    val data = ByteArray(width * height)
    gray.get(0, 0, data)
    var pv = 0

    // 根据均值进行二值分割
    val average = means.toArray()[0].toInt()
    for (i in data.indices) 
        pv = (data[i] and 255.toByte()).toInt()
        if (pv > average) 
            data[i] = 255.toByte()
         else 
            data[i] = 0.toByte()
        
    
    gray.put(0, 0, data)

    return gray

其中 gray 就是最后得到的二值图像,转换为Bitmap后可以在ImageView里面显示。

以上是关于Android OpenCV之基于均值实现图像二值分割的主要内容,如果未能解决你的问题,请参考以下文章

图像处理之积分图应用四(基于局部均值的图像二值化算法)

2021-09-23 opencv学习笔记(图像变换,二值化,滤波器介绍及python实现)

基于OpenCV和C++原生(JNI)的Android数字图像处理+人脸识别demo

基于OpenCV 图像处理的Android 找茬App 设计与实现

《opencv学习》 之 二值化

OpenCv 025---图像去噪