2018-11-24 17:06:23 weixin_43789163 阅读数 1549

电子科技大学 格拉斯哥学院 2017级 徐冰砚

浅谈图像处理在医学方面的应用

1、背景:

在上学期的新生研讨课中,曾兵院长介绍了图像处理的相关原理和应用。图像处理(image processing)是一种用计算机对图像进行分析,以达到所需结果的技术。在获得图像之后,需要用专门的设备将其数字化,即通过取样和量化过程将一个以自然形式存在的图像变换为适合计算机处理的数字形式。图像在计算机内部被表示为一个数字矩阵,矩阵中每一元素称为像素。
图像处理有各种应用途径,卫星图像处理、面孔识别特征识别、显微图像处理等等,给我印象最为深刻的是图像处理在医学方面的应用。目前临床广泛使用的医学成像模式主要分为四类:X- 射线成像、核磁共振成像(MRI)、核医学成像(NMI)、超声波成像(Ultrasonic Imaging)。图像分析可以将医学模拟图像转化为数字图像,开展了计算机辅助诊断(computer aided diagnosis)的初步研究,在一定程度上可以辅助医生分析医学图像,从而排除人为主观因素,提高诊断准确性和效率。

2、医学图像处理技术:

(1) 图像分割:
由于人体的组织器官不均匀、器官蠕动等造成医学图像一般具有噪声、病变组织边缘模糊等特点, 医学图像分割技术的目的就是将图像中感兴趣的区域清楚的提取出来, 这样就能为后续的定量、定性分析提供图像基础,同时它也是三维可视化的基础。现在有的图像分割方法有如下几种:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。

(2) 图像配准和图像融合:
医学图像配准是指对于一幅医学图像通过一种或一系列的空间变换,使它与另一幅医学图像上的对应点达到空间上的一致。配准的结果应使两幅图像上所有的解剖点,或至少是所有具有诊断意义的点及手术感兴趣的点都达到匹配,配准处理一般可以分为图像变换和图像定位两种。
医学图像在空间域配准之后,就可以进行图像融合,融合图像的创建又分为图像数据的融合与融合图像的显示两部分来完成。图像融合的目的是通过综合处理应用这些成像设备所得信息以获得新的有助于临床诊断的信息。利用可视化软件,对多种模态的图像进行图像融合,可以准确地确定病变体的空间位置、大小、几何形状及它与周围生物组织之间的空间关系,从而及时高效地诊断疾病,也可以用在手术计划的制定、病理变化的跟踪、治疗效果的评价等方面。

(3) 伪彩色处理技术:

伪彩色图像处理技术是将黑白图像经过处理变为彩色图像, 可以充分发挥人眼对彩色的视觉能力, 从而使观察者能从图像中取得更多的信息。经过伪彩色处理技术, 提高了对图像特征的识别。临床研究对CT、MRI、B 超和电镜等图片均进行了伪彩色技术的尝试, 取得了良好的效果, 部分图片经过处理后可以显现隐性病灶。

3、总结:

随着医疗技术的蓬勃发展,对医学图像处理提出的要求也越来越高。医学图像处理技术发展至今,仍然还有很多亟待解决的问题。有效地提高医学图像处理技术的水平、与多学科理论的交叉融合、医务人员和计算机理论技术人员之间的交流就显得越来越重要。总之,医学图像作为现代医疗诊断的重要依据,必将在医药信息研究领域和计算机图像处理领域受到更多的关注。

4、参考文献:
[1]王新成.高级图像处理技术[M].北京:中国科学技术出版社,2001.
[2]丁莹.图像配准技术在医学图像处理中的应用研究[M].长春理工大学,2006.12.
[3]田捷.医学影像处理与分析[M], 电子工业出版社, 2003.
[4]田娅, 饶妮妮, 蒲立新.国内医学图像处理技术的最新动态[J].电子科技大学学报, 2002(5): 485- 489.
图片来源:(https://baike.baidu.com/item/医学图像分析/3939451#2)

2019-10-20 16:39:47 weixin_44225182 阅读数 218

概念

OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。(大津算法)

Otsu原理

对于图像 t (x,y),前景(即目标)和背景的分割阈值记作 T,属于前景的像素点数占整幅图像的比例记为 ω0,平均灰度为 μ0;背景像素点数占整幅图像的比例为 ω1,平均灰度为 μ1;整幅图像的平均灰度记为μ,类间方差记为g。
假设图像大小为M×N,图像中像素的灰度值小于阈值 T 的像素个数为 N0,像素灰度大于阈值T的像素个数为 N1在这里插入图片描述
注:(7)式是将(5)式代入(6)式得到的,我们的重点放在(7)式上。

Otsu用处

利用Otsu算法,我们可以得到一个阈值,利用该阈值对图像进行二值化等操作。相比于单阈值的固定阈值,otsu算法效果更好。

MATLAB中实现Otsu算法的是 garythresh()函数,一般都与im2bw()配套使用

例:

t=rgb2gray(imread('a1.jpg'));
x=graythresh(t);%获取otsu算得的阈值
t=im2bw(t,x);

graythresh()源码–MATLAB

function [level em] = graythresh(I)
%GRAYTHRESH Global image threshold using Otsu's method.
%   LEVEL = GRAYTHRESH(I) computes a global threshold (LEVEL) that can be
%   used to convert an intensity image to a binary image with IM2BW. LEVEL
%   is a normalized intensity value that lies in the range [0, 1].
%   GRAYTHRESH uses Otsu's method, which chooses the threshold to minimize
%   the intraclass variance of the thresholded black and white pixels.
%
%   [LEVEL EM] = GRAYTHRESH(I) returns effectiveness metric, EM, as the
%   second output argument. It indicates the effectiveness of thresholding
%   of the input image and it is in the range [0, 1]. The lower bound is
%   attainable only by images having a single gray level, and the upper
%   bound is attainable only by two-valued images.
%
%   Class Support
%   -------------
%   The input image I can be uint8, uint16, int16, single, or double, and it
%   must be nonsparse.  LEVEL and EM are double scalars. 
%
%   Example
%   -------
%       I = imread('coins.png');
%       level = graythresh(I);
%       BW = im2bw(I,level);
%       figure, imshow(BW)
%
narginchk(1,1);
validateattributes(I,{'uint8','uint16','double','single','int16'},{'nonsparse'}, ...
              mfilename,'I',1);

if ~isempty(I)
  % Convert all N-D arrays into a single column.  Convert to uint8 for
  % fastest histogram computation.
  I = im2uint8(I(:));
  num_bins = 256;
  counts = imhist(I,num_bins);
  
  % Variables names are chosen to be similar to the formulas in
  % the Otsu paper.
  p = counts / sum(counts);
  omega = cumsum(p);
  mu = cumsum(p .* (1:num_bins)');
  mu_t = mu(end);
  
  sigma_b_squared = (mu_t * omega - mu).^2 ./ (omega .* (1 - omega));

  % Find the location of the maximum value of sigma_b_squared.
  % The maximum may extend over several bins, so average together the
  % locations.  If maxval is NaN, meaning that sigma_b_squared is all NaN,
  % then return 0.
  maxval = max(sigma_b_squared);
  isfinite_maxval = isfinite(maxval);
  if isfinite_maxval
    idx = mean(find(sigma_b_squared == maxval));
    % Normalize the threshold to the range [0, 1].
    level = (idx - 1) / (num_bins - 1);
  else
    level = 0.0;
  end
else
  level = 0.0;
  isfinite_maxval = false;
end

% compute the effectiveness metric
if nargout > 1
  if isfinite_maxval
    em = maxval/(sum(p.*((1:num_bins).^2)') - mu_t^2);
  else
    em = 0;
  end
end

Ostu算法(个人实现 MATLAB版)

t=rgb2gray(imread('a1.jpg'));
[m,n]=size(t);

%counts为图片总像素个数值
counts=m*n;

%count是一个256行一列的矩阵 记录了每个灰度级上像素点的个数
count=imhist(t);

%每个灰度级上像素点占总像素点数量的比例(概率)
p=count/counts;

%cumsum 计算累加概率 
w0=cumsum(p);

%u  计算的是平均灰度  比如灰度级为0~125的平均灰度值
%(1:256)'  矩阵转置 1256列转换为2561列
u=cumsum(p.*(1:256)');

%u_end是全局平均灰度
u_end=u(end);

%d 求方差 d是256行一列的矩阵
d=(w0*u_end-u).^2./(w0.*(1-w0));

%在d中寻找为最大方差的灰度值 这里y是最大方差的灰度值
[x,y]=max(d);

%为了和im2bw配合使用 进行归一化
%x就是所得阈值
x=(y-1)/255

算法结果验证

t=rgb2gray(imread('a1.jpg'));
[m,n]=size(t);
counts=m*n;
count=imhist(t);
p=count/counts;
w1=cumsum(p);
u=cumsum(p.*(1:256)');
u_end=u(end);%u_end是全局平均灰度
d=(w1*u_end-u).^2./(w1.*(1-w1));
[x,y]=max(d);
x=(y-1)/255 %x就是所得阈值
xx=graythresh(t)%graythresh计算出的阈值

结果

%自己编写的代码计算出的阈值
x =

    0.7569

%利用garythresh计算出的阈值
xx =

    0.7569

结论
该代码与gragthresh()计算出的阈值大体上完全一致!

疑点解惑

在我们自己编写的代码中,计算方差用的是下面的公式,
与原理中计算方差的公式( g=ω0ω1(μ0-μ1)^ )不一样
难道是原理错了?
哈哈
不是,其实都是一个公式,我们在代码中的公式只是原理公式的变形罢了,这是为了减少变量,提高运算速度。

%d 求方差 d是256行一列的矩阵
d=(w1*u_end-u).^2./(w1.*(1-w1));

公式变形

在这里插入图片描述
注意:上图中的u就是验证代码中的u_end,代表的是图像全局的平均灰度
而u是代表灰度值 T前面的平均灰度。
这里要注意图中的w0u0就是验证代码中的u,对每个灰度级数乘以对应的概率并累加,这是因为u0的计算公式是每个灰度级乘以对应的数量,再除以前面一共的像素数量,这里前面一共的像素数量可以用总量乘以前面占的概率w0。哈哈,对,就是这里,就可以把w0u0中的w0约掉,所以w0*u0==u(这里的u是验证代码中的u,代表灰度值乘以概率的累加值)

其实只需要知道g=w0w1(u1-u0)^2就行了,验证代码只是为了减少变量,做了一下变形,哎,数学还是要学好啊
下面在给个版本的验证算法,原理差不多,只是个别地方做了精简(其实现在看来,这个算法反而搞复杂了)

C=imread('h.jpg');   
C=rgb2gray(C);
%读取图像

figure,imshow(C);title('原始灰度图像');%绘原图

count=imhist(C);                       %直方图统计
subplot(1,3,1); 
imhist(C);                  %绘制直方图

[r,t]=size(C); 

%图像矩阵大小 

N=r*t;                                 %图像像素个数 

L=256;                                 %制定凸显灰度级为256 
count=count/N;                        
%各级灰度出现概率

for i=2:L 
    if count(i)~=0  ;       
st=i-1;         
break
    end
end
%以上循环语句实现寻找出现概率不为0的最小灰度值
for i=L:-1:1 
    
if count(i)~=0; 
    
nd=i-1;  

break   


end 

end 

%实现找出出现概率不为0的最大灰度值
f=count(st+1:nd+1); 

p=st;q=nd-st; 
%p和q分别是灰度的起始和结束值

u=0;

for i=1:q
    
    u=u+f(i)*(p+i-1); 
    
    ua(i)=u; 
    
end 
%计算图像的平均灰度值
for i=1:q 
    
    w(i)=sum(f(1:i)); 
    
end 

%计算出选择不同k的时候,A区域的概率 

d=(u*w-ua).^2./(w.*(1-w));   %求出不同k值时类间方差 

[y,tp]=max(d);                %求出最大方差对应的灰度值 

th=tp+p;
if th<=160     
th=tp+p; 
else     
th=160 
end                            %根据具体情况适当修正门限 

Y1=zeros(r,t); 
for i=1:r 
    
for j=1:t 
        X1(i,j)=double(C(i,j));    
        
end 
end 
for i=1:r     
for j=1:t     
if (X1(i,j)>=th)         
Y1(i,j)=X1(i,j);     
else Y1(i,j)=0;     
end 
end 
end 
%上面一段代码实现分割 
figure,imshow(Y1);title('灰度门限分割图像');
2016-07-09 17:28:28 wuqingshan2010 阅读数 13336

帧间差法

一种通过对视频图像序列中相邻两帧作差分运算获得运动目标轮廓的方法。一般要经过滤波等处理,去噪处理。
原理:利用相邻两帧的相关性,以前一帧图像作为当前的背景图像(背景帧),然后将当前帧图像与背景图像进行差值运算,从而检测目标。
优点:速度快、适用于实时性较高的场合,且对环境整体光照变化不明感。
缺点:会出现空洞。当运动目标的色彩分布比较均匀时,且在前后两帖中,运动目标所在位置的差别在目标运动方向两侧,内部却没有什么变化,这样通过帖差法会漏检目标内部的像素点,导致运动目标有空洞出现。所W顿间差分法经常和其他检测方法联合使用提高检测效果。

三帧差法

原理:对两两差分得到的图像进行闭运算,然后相与得到结果图像。
优点:由于噪声具有在时间域难重复的特点,在进行了与运算后,部分孤立噪声也会得到消除,可以解决双影等现象。

背景建模

背景建模的目的是当取得估计的背景后,把视频倾图像转换为背景和运动前景两类,然后对其进行相应的处理,并得到检测结果。常用的背景估计方法有卡尔曼滤波法、高斯背景建模的方法。
卡尔曼滤波
卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法,且它能实现实时运行状态的估计和预测功能。在运用于背景建模中,卡尔曼滤波法是一种递归的背景估计方法,在线性动态系统且噪声是高斯噪声条件下效果最佳。当背景估计时,当前的估计值是由当前侦之前所有视频图像的信息得到的,而背景模型则由检测的当前顿图像来更新,因此一段时间内的视频图像信息,都会对当前背景模型产生一定的影响。递归的背景估计方法较非递归的方法相比,在实时系统中能够节约大量的计算机内存,但前者得到的背景模型如果出现错误,其背景更新较慢,会在很长一段时间内对运动目标的检测产生影响。所基于卡尔曼滤波的背景估计方法,应使用背景像素值而非运动前景像素值来更新当前的背景模型。
高斯背景建模
高斯背景建模法通过构建最佳的背景模型,从而准确地将运动目标从背景分离开来。那么,对背景如何进行建模,从而做好运动目标和背景的固有特征的区别,是高斯背景建模法要解决的关键问题。高斯混合背景建模的方法在稳定的复杂场景背景建模中得到了广泛的应用。高斯混合背景模型是将有限个高斯函数进行加权和的结果,多个高斯函数的多个峰使它能够表示出背景的多峰状态,从而能准确对光照变化、树叶抖动等较复杂的背景进行建模。

2019-07-22 22:44:25 wzz110011 阅读数 75

      今天在写论文的时候需要插一些电路图,电路原理图采用AltiumDesigner软件绘制,绘制完成后截图再保存为''.png''格式的图片插入word中,然而我发现插到word中后,图片的背景不是纯白,并且元器件的填充色不是白色,这样不太清晰。如下图所示:

论文及插图

        在红色框内,可以看到图片的背景不是word文档的纯白色。这样子的插图不规范,并且也不符合我强迫症的习惯。因此,我从网上查找解决的办法,有人说可以使用PhotoShop软件的魔术棒功能,将背景设置为透明,苦于我的笔记本没有安装ps,而且我也从未用过ps软件,所以这个方法不可行。

        我转而一想,虽然不会用PS,但是我学过Matlab和图像处理,PS能干的事Matlab应该也能做到。而Matlab是理工男的必备软件,常规语法和函数我也熟烂于心,用Matlab做这件事应该比我重新学习PS要来的快。我的思路是:将图片中像素值比较浅的全部设置为白色,比较深的直接设置为纯黑,阈值的选取可以通过直方图来找。程序如下:

%time2019.09.22 22;00 
%Auther:HuaSir
clear all;clc;
x = imread('1.png');%读入图片
subplot(2,2,1);
imshow(x);title('真彩色图');
y = rgb2gray(x);%彩色图转化为灰度图
[m,n] = size(y);%获取图片大小
finalPicture = zeros(m,n);%新建一个矩阵用于存储最终图片
subplot(2,2,2);
imshow(y);title('灰度图');
subplot(2,2,3);
imhist(y);title('直方图');%灰度的直方图
%循环遍历灰度图,将像素值比较小颜色浅的一概认为是纯白色
for i=1:m
   for j = 1:n
      if y(i,j)<220
         finalPicture(i,j)=0;
      else
          finalPicture(i,j)=255;
      end
   end
end
subplot(2,2,4);
imshow(finalPicture);title('最终结果');
imwrite(finalPicture,'2.png');

以下为输出结果:

标程序运行结果图

在灰度直方图中有两个峰值,一个是白色,一个是灰色(因为第一幅图片-真彩色图中,像素点最多的是背景中的白色,以及电路元件内部填充的灰色),经过处理之后,整个元件的边框与引脚为黑色,背景为纯白色,完美的解决了上述问题。如下面两幅图,经过处理后的图片变得黑白分明,这样的电路图插入到论文中清晰可见,也更为规范。这只是一个初步的程序,程序中生产新矩阵的代码是通过循环遍历的,这个操作稍显笨拙,后续改进可以采用find()函数或者其他的矩阵处理函数,另外,有些待图片可能会有噪声点,后续可以增加降噪的代码,解决这个问题。以后再遇到Word插图的问题,可以采用这个办法。

处理前的原图片
处理后的图片

 

2019-08-23 14:35:12 qinlele1994 阅读数 138

背景消除建模的基本原理是用 当前帧 - 背景模型 = 前景对象

该算法对于背景固定下的移动目标有着很好的效果。

GMM(高斯混合模型)是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息表示别境,然后使用统计差分进行目标像素判断达到预期效果。

高斯混合模型:使用高斯概率密度函数精确的量化事物,将一个事物分解为若干个基于高斯概率密度函数行程的模型。

二维:事物的数学表现形式是曲线,任何一个曲线,无论多么复杂,都可用若干个高斯模型去逼近他。

三维:任何一个曲面都可以用高斯函数来逼近,像蜿蜒起伏的山谷。

以上是本人对该算法的一些简浅的总结。

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main()
{
	//VideoCapture capture(0);  使用摄像头进行捕捉
	VideoCapture capture;
	capture.open("demo5.mp4");
	if (!capture.isOpened())
	{
		printf("cloud not find the file\n");
		return -1;
	}

	Mat frame;  //从视屏中读取的原始帧
	Mat bsmaskMOG2;

	Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
	
	while (capture.read(frame))
	{
		imshow("input_video",frame);
		pMOG2->apply(frame, bsmaskMOG2);
		imshow("MOG2", bsmaskMOG2);
		char c = waitKey(30);
		if (c == 27)
		{
			break;
		}
	}

	capture.release();
	waitKey(0);
	return 0;
}

实验视频为办公室拍摄,因为手持手机拍摄,所以拍摄过程中有些抖动,造成大量噪声点。

可在程序中加上一些滤波操作,去除噪声,框出目标并添加坐标位置,类似操作将在下篇博客中添加。

算法效果:

KNN

这个算法就不多说了,K最近邻,简单理解就是每一个像素都可以被他身边的K个弟兄代表,,,

这个算法告诉我们,要有危机意识,不努力容易被身边人替代啊。。。

KNN用于跟踪算法实现:

Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();

 

没有更多推荐了,返回首页