基于MATLAB的脊段函数转换成C++
我将使用OpenCV对输入图像执行脊线分割。从互联网上,我发现一个Matlab代码,如下所示,非常符合我的目标:基于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))');
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是否使用重叠块或平铺,您的代码是否使用平铺。