基于MATLAB的脊段函数转换成C++

基于MATLAB的脊段函数转换成C++,c++,matlab,opencv,C++,Matlab,Opencv,我将使用OpenCV对输入图像执行脊线分割。从互联网上,我发现一个Matlab代码,如下所示,非常符合我的目标: function [normim, mask, maskind] = ridgesegment(im, blksze, thresh) im = normalise(im,0,1); % normalise to have zero mean, unit std dev fun = inline('std(x(:))*ones(size(x))');

我将使用OpenCV对输入图像执行脊线分割。从互联网上,我发现一个Matlab代码,如下所示,非常符合我的目标:

function [normim, mask, maskind] = ridgesegment(im, blksze, thresh)

    im = normalise(im,0,1);  % normalise to have zero mean, unit std dev

    fun = inline('std(x(:))*ones(size(x))');

    stddevim = blkproc(im, [blksze blksze], fun);

    mask = stddevim > thresh;
    maskind = find(mask);

    % Renormalise image so that the *ridge regions* have zero mean, unit
    % standard deviation.
    im = im - mean(im(maskind));
    normim = im/std(im(maskind));
end
所以我试着把它转换成C++。到目前为止,我只能完成以下几部分:

cv::Mat ridgeSegment(cv::Mat inputImg, int blockSize, double thresh)
{
    cv::normalize(inputImg, inputImg, 0, 1.0, cv::NORM_MINMAX, CV_8UC1);
    blkproc(inputImg, cv::Size(blockSize, blockSize), thresh);
    ...// how to do the next steps ????
}

cv::Mat blkproc(cv::Mat img, cv::Size size, double thresh)
{
    cv::Mat croppedImg;
    for (int i = 0; i < im.cols; i += size.width)
    {
        for (int j = 0; j < im.rows; j += size.height)
        {
            croppedImg = im(cv::Rect(i, j, size.width, size.height)).clone();

            //perform standard deviation calculation here???
        }
    }

    return croppedImg;
}

我不知道如何在这里继续下去。特别是stddevim及其后期部分。有人能给我解释一下其余的吗?先谢谢你

用给定的块大小计算每个子图像的标准偏差啊,我知道那部分。其余的呢?找到块std dev大于某个阈值的所有像素。计算这些像素的平均值和stddev,并将其应用于图像:每个像素=像素平均值/stddev。或者您的问题是如何计算stddev?使用.Tipp:如果您不想在处理过程中更改像素值,您可以删除.clone,而您不需要这样做。在循环中,您必须检查rect是否合法,例如完全在图像中,否则它将崩溃。我不知道blkproc是否使用重叠块或平铺,您的代码是否使用平铺。