对比噪声比 衬噪比 CNR计算公式(附代码~注释清楚易懂)

1、计算公式

参照文献《The Generalized Contrast-to-Noise Ratio: A Formal Definition for Lesion Detectability》中的计算方式
doi:10.1109/TUFFC.2019.2956855
C N R = ∣ μ R O I − μ b a c k g r o u n d ∣ σ R O I 2 + σ b a c k g r o u n d 2 CNR=\frac{|\mu_{ROI}-\mu_{background}|}{\sqrt{\sigma_{ROI}^2+\sigma_{background}^2}} CNR=σROI2+σbackground2 μROIμbackground

2、代码实现

function CNR = get_CNR(img, x_center, y_center)
    % 感兴趣区域(ROI)的坐标范围[xmin, ymin, xmax, ymax]
    % 这里我设置的是质心上下左右各外扩10像素,你们可以自己改
    xmin = round(x_center - 10);
    xmax = round(x_center + 10);
    ymin = round(y_center - 10);
    ymax = round(y_center + 10);
    
    % 获取ROI区域像素在全局图像中的下标
    % sub2ind函数能够将矩阵中元素的下标转换为对应的线性索引,因此思路如下:
    % 1、选取由[xmin,ymin,xmax,ymax]框成的矩形区域
    % 2、得到这个区域内每一个像素的坐标值,由于sub2ind的输入要求(参照matlab官网),其需要分开指定对应元素的行和列
    % 因此需要将ROI内每一个像素的横纵坐标分别存储至x数组和y数组中(用ndgrid函数)
    % 3、基于得到的x数组和y数组以及sub2ind函数得到这堆像素的线性索引,并使用setdiff函数得到背景的线性索引
    % 4、基于ROI和背景像素的线性索引得到其像素强度,然后计算得到CNR值
    [x,y] = ndgrid(xmin:xmax, ymin:ymax); % 将ROI中元素的对应横坐标和纵坐标分别存储
    roi_idx = sub2ind(size(img), x(:), y(:));
    % 获取背景区域像素在全局图像中的下标
    bg_idx = setdiff(1:numel(img), roi_idx); 
    
    % 将感兴趣区域和背景区域的像素赋值到roi和bg中
    roi = double(img(roi_idx));
    bg = double(img(bg_idx));

    roi_mean = mean(roi); % 计算感兴趣区域的平均灰度值
    bg_mean = mean(bg); % 计算背景区域的平均灰度值

    CNR = abs(roi_mean - bg_mean) / sqrt(var(roi) + var(bg)); % 计算CNR
end

3、结语

最近自己也在弄CNR指标的计算,看了看网上说法各异没有统一,因此参照了这篇论文的计算方式并自己用代码实现了,代码已经测试过,没有问题,希望能够帮到你们

你可能感兴趣的:(算法,matlab,开发语言)