Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV只获取像Matlab函数GraySthresh一样的Otsu阈值_Opencv_Image Processing - Fatal编程技术网

OpenCV只获取像Matlab函数GraySthresh一样的Otsu阈值

OpenCV只获取像Matlab函数GraySthresh一样的Otsu阈值,opencv,image-processing,Opencv,Image Processing,如何使用类似OpenCV的Matlab函数GraySthresh仅获取Otsu阈值 例如,如果我写这段代码,我会像使用Matlab函数im2bw一样得到二进制图像: Mat bw; uint8_t data[14] = { 10, 10, 10, 10, 10, 10, 20, 20, 54, 54, 54, 54, 55, 55 }; Mat M(1, 14, CV_8UC1, &data); threshold(M, bw, 0, 1, CV_THRESH_BINARY | CV_T

如何使用类似OpenCV的Matlab函数GraySthresh仅获取Otsu阈值

例如,如果我写这段代码,我会像使用Matlab函数im2bw一样得到二进制图像:

Mat bw;
uint8_t data[14] = { 10, 10, 10, 10, 10, 10, 20, 20, 54, 54, 54, 54, 55, 55 };
Mat M(1, 14, CV_8UC1, &data);
threshold(M, bw, 0, 1, CV_THRESH_BINARY | CV_THRESH_OTSU);

如果设置了THRESH_OTSU标志,函数
cv::threshold()
将返回计算出的阈值

double thres_val = cv::threshold(M, bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

有关更多信息,请参阅。

如果要避免执行阈值,而只需要值,请执行OpenCV中的操作:

double getThreshVal_Otsu_8u( const cv::Mat& _src )
{
    cv::Size size = _src.size();
    if ( _src.isContinuous() )
    {
        size.width *= size.height;
        size.height = 1;
    }
    const int N = 256;
    int i, j, h[N] = {0};
    for ( i = 0; i < size.height; i++ )
    {
        const uchar* src = _src.data + _src.step*i;
        for ( j = 0; j <= size.width - 4; j += 4 )
        {
            int v0 = src[j], v1 = src[j+1];
            h[v0]++; h[v1]++;
            v0 = src[j+2]; v1 = src[j+3];
            h[v0]++; h[v1]++;
        }
        for ( ; j < size.width; j++ )
            h[src[j]]++;
    }

    double mu = 0, scale = 1./(size.width*size.height);
    for ( i = 0; i < N; i++ )
        mu += i*h[i];

    mu *= scale;
    double mu1 = 0, q1 = 0;
    double max_sigma = 0, max_val = 0;

    for ( i = 0; i < N; i++ )
    {
        double p_i, q2, mu2, sigma;

        p_i = h[i]*scale;
        mu1 *= q1;
        q1 += p_i;
        q2 = 1. - q1;

        if ( std::min(q1,q2) < FLT_EPSILON || std::max(q1,q2) > 1. - FLT_EPSILON )
            continue;

        mu1 = (mu1 + i*p_i)/q1;
        mu2 = (mu - q1*mu1)/q2;
        sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);
        if ( sigma > max_sigma )
        {
            max_sigma = sigma;
            max_val = i;
        }
    }

    return max_val;
}
double getThreshVal\u Otsu\u 8u(const cv::Mat&\u src)
{
cv::Size Size=_src.Size();
如果(_src.isContinuous())
{
尺寸.宽度*=尺寸.高度;
尺寸.高度=1;
}
常数int N=256;
int i,j,h[N]={0};
对于(i=0;i最大西格玛)
{
最大西格玛=西格玛;
max_val=i;
}
}
返回最大值;
}

将它放在您自己的命名空间中,或放在匿名命名空间中,以避免可能的冲突。

thres_val=通过Otsu方法计算的阈值。谢谢。