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指标的计算,看了看网上说法各异没有统一,因此参照了这篇论文的计算方式并自己用代码实现了,代码已经测试过,没有问题,希望能够帮到你们