本文来源于作者的硕士课题,以前列腺超声图像为案列,讲解了超声图像的增强去噪过程。
超声成像因其价廉、简便、成像迅速、无创、无辐射性、准确、可连续动态及重复扫描等特点被广泛推广应用,常作为实质脏器及含液器官的首选方法。但超声获取的前列腺图像会带有散斑噪声,并且边缘并不是十分清晰,为了提高后续图像处理的精度用于引导穿刺,需要弱化获取前列腺超声图像过程中产生的斑点噪声,并且锐化超声图像的前列腺器官边缘,以提高后续分割的精度。图像增强方法是强调某些感兴趣的特征,抑制不感兴趣的特征,改善图像质量、丰富信息量,加强图像判读和识别效果。因此,需要对前列腺超声图像进行增强。
现代超声图像增强的方法主要分为空域增强与频域增强,空域增强即在像素灰度级层次对图像进行变换、运算与滤波,频域增强即将图像通过傅里叶变换,变换到频域,然后进行滤波操作。
空域增强主要用于削弱加性噪;频域增强中的同态滤波与Retinex滤波主要用于去除乘性或卷积性噪声,Retinex滤波去除噪声的同时会削弱图片细节,而同态滤波会增强细节。前列腺超声图像中的斑点噪声属于乘性噪声,同时需要对前列腺超声图像的器官边缘进行增强以利于后续分割。因此,本课题提出了一种适用于前裂隙超声图像的改进的图像增强方法,实现过程是:用同态滤波算法弱化前列腺超声图像的斑点噪声,用直方均衡算法补偿同态滤波算法去噪的过程中的信息熵损失,最后用金字塔特征融合算法进行分层融合。
对前列腺超声图像进行直方图均衡来增强,这是一种空域的增强方法。实质上是对前列腺超声图像进行非线性拉伸,重新分配图像灰度级的像素点个数,使一定灰度范围内的像素点数量大致相等。这样,原来灰度级像素点数量多的会减少,灰度级像素点少的会增多,即灰度直方图中直方图中的峰顶部分的会降低,而两侧的谷底部分会升高。均衡后的前列腺超声图像的直方图是一个较平的直方图,图像的对比度会得到增强,信息熵得到提升。
前列腺超声图像灰度直方图是表示图像中每一灰度出现频率的统计关系,如下图所示。前列腺超声图像直方图能给出前列腺超声图像的灰度范围、每个灰度的频度和灰度的分布、整幅前列腺超声图像的平均明暗和对比度等概貌性描述。前列腺超声图像灰度直方图是灰度级的函数,反映的是前列腺超声图像中具有该灰度级像素的个数,其横坐标是灰度级,纵坐标是该灰度级出现的频率,即像素的个数,整个坐标系描述的是图像灰度级的分布情况。由此可以看出前列腺超声图像的灰度分布特性,即若大部分像素集中在低灰度区域,图像呈现暗的特性;若像素集中在高灰度区域,图像呈现亮的特性。
前列腺超声图像的直方图均衡化的基本思想是对原始前列腺超声图像的像素灰度做积分映射变换,如图2-5,即将随机分布的前列腺超声图像直方图修改成均匀分布的直方图。
设变量 r r r代表前列腺超声图像中像素灰度级,对灰度级进行归一化处理, 则 0 ≤ r ≤ 1 0≤r≤1 0≤r≤1, 其中 r = 0 r=0 r=0表示黑, r = 1 r=1 r=1表示白。对于给定的一幅前列腺超声图像来说, 每个像素值在[0,1]的灰度级是随机的。用概率密度函数 P r ( r ) P_r (r) Pr(r)来表示前列腺超声图像灰度级的分布。
为了有利于前列腺超声图像处理, 引入离散形式。在离散形式下, 用 r k r^k rk
代表离散灰度级,用 p r ( r k ) p_r (r^k ) pr(rk)代表 p r ( r ) p_r (r) pr(r) ,则下式成立:
p r ( r k ) = n k n p_r (r^k )=\text{\(\cfrac{nk} n\)} pr(rk)=nnk
其中, 0 ≤ r k 0≤r^{k} 0≤rk ≤ 1 , k = 0 , 1 , 2 , … , n − 1 ≤1,k=0,1,2,…,n-1 ≤1,k=0,1,2,…,n−1。式中 n k n^k nk为前列腺超声图像中出现 r k r^k rk这种灰度的像素数,n是前列腺超声图像中的像素总数, 而 n k n \cfrac{nk}{n} nnk就是概率论中的频数。前列腺超声图像进行直方图均衡化的函数表达式为:
S i = T ( r i ) = ∑ 0 k − 1 n i n S_i=T(r_i)=\displaystyle\sum_0^{k-1} \cfrac{n_i}{n} Si=T(ri)=0∑k−1nni
式中, k k k为灰度级数。
前列腺超声图像均衡化的结果如图,变换后前列腺超声图像灰度的概率密度呈均匀分布,这就意味着前列腺超声图像灰度的动态范围得到了增加,提高了前列腺超声图像的对比度,即信息熵,如下表所示。
图片 | 信息熵(entropy) |
---|---|
原图 | 7.5 |
直方均衡后 | 7.7 |
超声图像直方均衡实现代码如下:
import cv2
src = cv2.imread("standardprostate.jpg")
src_gray = cv2.cvtColor(src,cv2.COLOR_RGB2GRAY)
src_eqlzd = cv2.equalizeHist(src_gray)
cv2.namedWindow('src', cv2.WINDOW_NORMAL)
cv2.imshow('src',src)
cv2.namedWindow('src_gray', cv2.WINDOW_NORMAL)
cv2.imshow('src_gray',src_gray)
cv2.imwrite('spgray.jpg',src_gray)
cv2.namedWindow('src_eqlzd', cv2.WINDOW_NORMAL)
cv2.imshow('src_eqlzd',src_eqlzd)
cv2.imwrite('speqlzd.jpg',src_eqlzd)
cv2.waitKey(0)
cv2.destroyAllWindows()
从前列腺超声图像的直方图中可以看到前列腺超声图像灰度级动态范围大,但是前列腺超声图像暗区的细节又不清楚。本课题希望增强暗区细节的同时不损失亮区细节,一般来说,可以将前列腺超声图像 f ( x , y ) f(x,y) f(x,y)建模成照射强度 i ( x , y ) i(x,y) i(x,y)和反射强度 r ( x , y ) r(x,y) r(x,y)的乘积,所以有:
f ( x , y ) = i ( x , y ) r ( x , y ) f(x,y)=i(x,y)r(x,y) f(x,y)=i(x,y)r(x,y)
一般来说,照射强度均匀变化,所以i是低频分量,反射强度是具有突变的,所以r是高频分量。本课题希望对前列腺超声图像低频分量进行压制,这样就降低了前列腺超声图像的灰度级动态范围,而要对前列腺超声图像高频进行提高,这样就增强了前列腺超声图像的对比度。
如果通过某种变换,使前列腺超声图像的高频分量与低频分量其变成线性组合,那么便可以更方便的运用线性操作对前列腺超声图像的高频分量与低频分量进行处理,从而达到增强前列腺超声图像的效果,这便是同态滤波算法的基本过程。
由于时域相乘等价于频率域卷积,所以无法在频率域将前列腺超声图像的高频分量与低频分量分开。于是,同态滤波算法是先对前列腺超声图像反射照射模型两边取对数,然后做傅里叶(Fourier)变换,这样得到了线性组合的前列腺超声图像的频率域。
l n f ( x , y ) = l n i ( x , y ) + l n r ( x , y ) lnf(x,y)=lni(x,y)+lnr(x,y) lnf(x,y)=lni(x,y)+lnr(x,y)
F F T l n f ( x , y ) = F F T l n i ( x , y ) + F F T l n r ( x , y ) FFTlnf(x,y)=FFTlni(x,y)+FFTlnr(x,y) FFTlnf(x,y)=FFTlni(x,y)+FFTlnr(x,y)
为了抑制前列腺超声图像的低频分量,提高高频分量,应选用高通滤波器。常用的高通滤波器有:理想高通滤波器、巴特沃斯(Butterworth)高通滤波器和高斯高通滤波器,由于理想高通滤波器与巴特沃斯滤波器均有振铃现象,丢失高频信息,会对前列腺超声复原图像质量造成严重影响,于是,这里采用高斯滤波滤波器,如图所示。
高斯滤波器中待确定的参数与含义,如下表所示:
参数 | 含义 |
---|---|
γ H γ_H γH | 高频增益,需要大于1 |
γ L γ_L γL | 低频增益,取值在0和1之间 |
C C C | 斜面锐化系数 |
S i g m a Sigma Sigma | 截止频率,越大图像越亮 |
经过大量实验,最终确定: γ H = 2 , γ L = 0.7 , C = 0.1 , S i g m a = 70 γ_H=2,γ_L=0.7,C=0.1,Sigma=70 γH=2,γL=0.7,C=0.1,Sigma=70。
然后再将高斯滤波后的前列腺超声图像进行傅里叶反变换,再取幂,就可以得到最终的处理后的图像 g ( x , y ) g(x,y) g(x,y),整个过程的流程图如图。
经实验测得前列腺超声图像同态滤波后的各项评估数值结果如下表所示:
图片 | PSNR(峰值信噪比) | MSE(均方差) | Entropy(信息熵) |
---|---|---|---|
原图电脑 | Inf | 0 | 7.5 |
直方均衡后 | 27.3 | 120.7 | 7.7 |
同态滤波后 | 30.0 | 65.4 | 7.5 |
超声图像同态滤波实现代码如下:
import cv2
import numpy as np
import evo
#同态滤波函数
def homomorphic_filter(src,d0=70,c=0.1,rh=2.2,h=2.2,r1=0.7,l=0.7):
#d0 截止频率,越大图像越亮
#r1 低频增益,取值在0和1之间
#rh 高频增益,需要大于1
#c 锐化系数
#图像灰度化处理
gray = src.copy()
if len(src.shape) > 2:#维度>2
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#图像格式处理
gray = np.float64(gray)
#设置数据维度n
rows, cols = gray.shape
#傅里叶变换
gray_fft = np.fft.fft2(gray)
#将零频点移到频谱的中间,就是中间化处理
gray_fftshift = np.fft.fftshift(gray_fft)
#生成一个和gray_fftshift一样的全零数据结构
dst_fftshift = np.zeros_like(gray_fftshift)
#arange函数用于创建等差数组,分解f(x,y)=i(x,y)r(x,y)
M, N = np.meshgrid(np.arange(-cols // 2, cols // 2), np.arange(-rows//2, rows//2))#注意,//就是除法
#使用频率增强函数处理原函数(也就是处理原图像dst_fftshift)
D = np.sqrt(M ** 2 + N ** 2)#**2是平方
Z = (rh - r1) * (1 - np.exp(-c * (D ** 2 / d0 ** 2))) + r1#
dst_fftshift = Z * gray_fftshift
dst_fftshift = (h - l) * dst_fftshift + l
#傅里叶反变换(之前是正变换,现在该反变换变回去了)
dst_ifftshift = np.fft.ifftshift(dst_fftshift)
dst_ifft = np.fft.ifft2(dst_ifftshift)
#选取元素的实部
dst = np.real(dst_ifft)
#dst中,比0小的都会变成0,比255大的都变成255
#uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0–255
dst = np.uint8(np.clip(dst, 0, 255))
return dst
#主函数开始
img = cv2.imread('standardprostate.jpg',0)
#将图片执行同态滤波器
img_new = homomorphic_filter(img)
cv2.imwrite("sptongtai.jpg", img_new)
def excel(n):
n=200
re=[[0]*3 for i in range(n) ]#创建一个二维列表
for i in range(n):
img_new = homomorphic_filter(img,i)
re[i][0]=evo.psnr(img,img_new)
re[i][1]=evo.mse(img,img_new)
re[i][2]=evo.entropy(img_new)
output=open('evostrengthen.xls','w',encoding='gbk') #不需要事先创建一个excel表格,会自动生成,gbk为编码方式,支持中文,w代表write
output.write('psnr\tmse\tentropy\n')
for i in range(len(re)):
for j in range(len(re[i])):
output.write(str(re[i][j])) #write函数不能写int类型的参数,所以使用str()转化
output.write('\t') #相当于Tab一下,换一个单元格
output.write('\n') #写完一行立马换行
output.close()
#输入和输出合并在一起输出
result = np.hstack((img,img_new))
#打印
cv2.imshow('outputPicName',result)
cv2.waitKey()
cv2.destroyAllWindows()
前列腺超声图像经过直方均衡与同态滤波算法分别增强后,获得了两幅增强的前列腺超声图像,利用这两幅图像在时空上的相关性及信息上的互补性,本课题希望获得一幅融合的前列腺超声图像,这样融合后得到的图像对前列腺腺体有更全面、清晰的描述,且相对原始的前列腺超声图像具有较高的空间分辨率和光谱分辨率,具有明显的突出信息和较低的斑点噪声。从而更有利于人眼的识别和机器的识别与处理,继而提高后续的图像分割性能。
一般情况下,图像融合算法由层次低到高分为:信号级融合、数据级融合、特征级融合、决策级融合。
信号级融合是在最低层对未经处理的传感器输出在信号域进行混合,产生一个融合后的信号。融合后的信号与源信号形式相同但品质更好,来自传感器的信号可建模为混有不同相关噪声的随机变量。此种情况下,融合可以考虑为一种估计过程,信号级图像融合在很大程度上是信号的最优集中或分布检测问题。
像素级图像融合是四个层次中最基本的融合,经过像素级图像融合以后得到的图像具有更多的细节信息,如边缘、纹理的提取,有利于图像的进一步分析、处理与理解,还能够把潜在的目标暴露出来,利于判断识别潜在的目标像素点的操作,这种方法才可以尽可能多的保存源图像中的信息,使得融合后的图片不论是内容还是细节都有所增加,这个优点是独一无二的,仅存在于像素级融合中。但像素级图像融合的局限性也是不能忽视的,由于它是对像素点进行操作,所以计算机就要对大量的数据进行处理,处理时所消耗的时间会比较长,就不能够及时地将融合后图像显示出来,无法实现实时处理;另外在进行数据通信时,信息量较大,容易受到噪声的影响。
特征级图像融合是从源图像中将特征信息提取出来,这些特征信息是观察者对源图像中目标或感兴趣的区域,如边缘、人物、建筑或车辆等信息,然后对这些特征信息进行分析、处理与整合从而得到融合后的图像特征。对融合后的特征进行目标识别的精确度明显的高于原始图像的精确度。特征级融合对图像信息进行了压缩,再用计算机分析与处理,所消耗的内存与时间与像素级相比都会减少,所需图像的实时性就会有所提高。特征级图像融合对图像匹配的精确度的要求没有第一层那么高,计算速度也比第一层快,可是它提取图像特征作为融合信息,所以会丢掉很多的细节性特征。
决策级图像融合是以认知为基础的方法,它不仅是最高层次的图像融合方法,抽象等级也是最高的。决策级图像融合是有针对性的,根据所提问题的具体要求,将来自特征级图像所得到的特征信息加以利用,然后根据一定的准则以及每个决策的可信度(目标存在的概率)直接作出最优决策。四个个融合层级中,决策级图像融合的计算量是最小的,可是这种方法对前一个层级有很强的依赖性,得到的图像与前两种融合方法相比不是很清晰。将决策级图像融合实现起来比较困难,但图像传输时噪声对它的影响最小。
目前研究和应用最多的是信号级和像数级图像融合,提出的绝大多数的图像融合算法属于这两层次上。
对于后续前列腺超声图像的分割模型来说,融合的图像应包含尽量多的细节信息、尽量少的斑点噪声。在频域中,前列腺超声图像可以认为是由不同频率的信息组成,包含了很多不同的特征。低频信号和高频信号也可以叫做低频分量和高频分量,前列腺超声图像中的高频分量,指的是图像强度(亮度/灰度)变化剧烈的地方,也就是常说的边缘、轮廓;前列腺超声图像中的低频分量,指的是图像强度(亮度/灰度)变换平缓的地方,也就是大片色块的地方。
因此,为了达到本课题的目的,应对前列腺超声图像中不同的频率分量选择不同大小的融合窗口进行处理,在低频处采用较大的融合窗口以避免截断现象,在高频处采用较小的融合窗口以避免鬼影现象,最终得到平滑无鬼影的融合结果。
所以,本课题采用拉普拉斯金字塔特征融合法,在这种方法中前列腺超声图像的低层特征分辨率更高,包含更多位置、细节信息,但是由于经过的卷积更少,其语义性更低,噪声更多。前列腺超声图像的高层特征具有更强的语义信息,但是分辨率很低,对细节的感知能力较差。金字塔特征融合法将两者高效融合,取其长处,弃之糟泊,它的整体实现过程如图2-11所示。
从图中,可以看出拉普拉斯金字塔由高斯金字塔构造而来,因此,在构造拉普拉斯金字塔之前,应先构造高斯金字塔。
高斯金字塔的每一层的构建步骤分为两步:首先对下一层的图像进行高斯模糊,然后删除模糊后的图像的偶数行和列,就得到了当前层的图像。不断进行这个步骤几次,最终就得到了高斯金字塔。
拉普拉斯金字塔每一层的构造为同一层高斯金字塔的图像减去上一层的图像,然后进行上采样,并高斯模糊的结果。
L i = G i − U P ( G i + 1 ) ⊗ G 5 × 5 L_i=G_i-UP(G _{i+1} )⊗G_{5×5} Li=Gi−UP(Gi+1)⊗G5×5
前列腺超声图像融合后各项评估指标结果如下表所示。
图片 | PSNR(峰值信噪比) | MSE(均方差) | Entropy(信息熵) |
---|---|---|---|
原图 | Inf | 0 | 7.5 |
直方均衡后 | 27.3 | 120.7 | 7.7 |
同态滤波后 | 30.0 | 65.4 | 7.5 |
融合后 | 29.7 | 69.1 | 7.7 |
可见融合的前列腺超声图像后在信噪比与均方差损失很少的情况下实现了信息熵的较大幅度提升。
超声图像融合代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
def sameSize(img1, img2):
"""
使得img1的大小与img2相同
"""
rows, cols, dpt = img2.shape
dst = img1[:rows,:cols]
return dst
apple = cv2.imread("sptongtai.jpg")
orange = cv2.imread("speqlzd.jpg")
# 对apple进行6层高斯降采样
G = apple.copy()
gp_apple = [G]
for i in range(6):
G = cv2.pyrDown(G)
gp_apple.append(G)
# 对orange进行6层高斯降采样
G = orange.copy()
gp_orange = [G]
for j in range(6):
G = cv2.pyrDown(G)
gp_orange.append(G)
# 求apple的Laplace金字塔
lp_apple = [gp_apple[5]]
for i in range(5,0,-1):
GE = cv2.pyrUp(gp_apple[i])
L = cv2.subtract(gp_apple[i-1],sameSize(GE,gp_apple[i-1]))
lp_apple.append(L)
# 求orange的Laplace金字塔
lp_orange = [gp_orange[5]]
for i in range(5,0,-1):
GE = cv2.pyrUp(gp_orange[i])
L = cv2.subtract(gp_orange[i-1],sameSize(GE,gp_orange[i-1]))
lp_orange.append(L)
# 对apple和orange的Laplace金字塔进行1/2拼接
LS = []
for la,lb in zip(lp_apple,lp_orange):
la.astype(int)
lb.astype(int)
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols//2],lb[:,cols//2:]))
LS.append(ls)
# 对拼接后的Laplace金字塔重建获取融合后的结果
ls_reconstruct = LS[0]
for i in range(1,6):
ls_reconstruct = cv2.pyrUp(ls_reconstruct)
ls_reconstruct = cv2.add(sameSize(ls_reconstruct,LS[i]), LS[i])
# 各取1/2直接拼接的结果
r,c,depth = apple.shape
real = np.hstack((apple[:,0:c//2],orange[:,c//2:]))
#将参数元组的元素数组按水平方向进行叠加,必须用//为整除
plt.subplot(221), plt.imshow(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB))
plt.title("tongtai"),plt.xticks([]),plt.yticks([])
plt.subplot(222), plt.imshow(cv2.cvtColor(orange,cv2.COLOR_BGR2RGB))
plt.title("eqlzd"),plt.xticks([]),plt.yticks([])
plt.subplot(223), plt.imshow(cv2.cvtColor(real,cv2.COLOR_BGR2RGB))
plt.title("real"),plt.xticks([]),plt.yticks([])
plt.subplot(224), plt.imshow(cv2.cvtColor(ls_reconstruct,cv2.COLOR_BGR2RGB))
plt.title("laplace_pyramid"),plt.xticks([]),plt.yticks([])
plt.show()
以上就是超声图像的增强,欢迎交流~