完整的论文代码见文章末尾 以下为部分内容
摘要
本研究旨在针对大脑核磁图像中的黑色腔体进行有效分割,以提供可靠的腔体定位和分析。为此,采用了三种常用的图像分割方法:8邻域区域生长法、Canny算子边缘检测和8邻域边界跟踪法。
首先,应用8邻域区域生长法来识别具有相似性质的像素,并将其合并为腔体区域。该方法基于种子点的选择和与相邻像素的相似性判断,能够快速而准确地生成初步的腔体分割结果。
其次,运用Canny算子边缘检测方法,通过计算图像梯度和非极大值抑制,实现对腔体边缘的精细检测。该算法能够提取出清晰的边缘信息,对于复杂的腔体结构有较好的适应性。
最后,采用8邻域边界跟踪法对初步分割得到的腔体边缘进行追踪,从起始点开始形成闭合的边界线。该方法通过遍历邻域像素点,递归地跟踪边界,并生成完整的腔体轮廓。
通过对比实验结果,本文对三种方法在黑色腔体分割方面的优劣进行了分析。基于分割准确性、计算效率和鲁棒性等因素,我们提出了最佳的分割策略,以获得最优的黑色腔体分割结果。
本研究的成果对于大脑核磁图像的进一步分析和诊断具有重要意义,为相关领域的研究和应用提供了有力支持。
关键词: 大脑核磁图像、分割、8邻域区域生长法、Canny算子边缘检测、8邻域边界跟踪法、优化策略
实现原理
邻域区域生长法
区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。
简单来说下三个法则,对出需要分割的图像:
- 选取图像中的一点为种子点(种子点的选取需要具体情况具体分析)。
- 在种子点处进行8邻域或4邻域扩展,判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。
- 当不再有像素满足加入这个区域的准则时,区域生长停止。
canny算子边缘检测
Canny边缘检测算法可以分为以下5个步骤:
- 使用高斯滤波器,以平滑图像,滤除噪声。
- 计算图像中每个像素点的梯度强度和方向。
- 应用非极大值(Non-MaximumSuppression)抑制,以消除边缘检测带来的杂散响应。
- 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
- 通过抑制孤立的弱边缘最终完成边缘检测。
为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。大小为(2k+1)x(2k+1)的高斯滤波器核的生成方程式由下式给出:
本节代码展示:
clear;
img_src = imread("brain.jpg");
img_gray = rgb2gray(img_src);
img_int = img_gray(600:1000,700:1400); %截取图片
imshow(img_int);
img_int = smoothdata(img_int,'gaussian',10);
his = imhist(img_int); %统计灰度直方图
[x,y] = size(img_int);
thd = getOSTUThreshold(his); %获取大津法阈值
img_bw = zeros(x,y);
for i = 1:x %二值化
for k = 1:y
if img_int(i,k) > thd
img_bw(i,k) = 255;
else
img_bw(i,k) = 0;
end
end
end
SE = strel('rectangle',[50 50]); %创建结构矩阵
img_bw = imdilate(img_bw,SE); %图像腐蚀´
img_bw = imerode(img_bw,SE); %图像膨胀
img_bw = 255 - img_bw; %图像反转
img_bw = bwareaopen(img_bw,10000,8);% 去除小面积连通域
img_edge = edge(img_bw,'canny'); %canny算子检测边界
SE = strel('rectangle',[5 5]);
img_edge = imerode(img_edge,SE); %对边界进行膨胀
imshow(img_edge);
for i = 1:x %在原图中显示
for k = 1:y
if img_edge(i,k) == 1
img_src(i + 600,k + 700) = 255;
end
end
end
imshow(img_src);
function thd = getOSTUThreshold(his)
sum = 0; %个数和
valueSum = 0; %值的和
g = 0; %类间方差
g_per = 0;
low = 0; %w1小于阈值的点数占比
high = 0;
ave_low = 0; %u1小于阈值的值的平均
ave_high = 0;
min = 1; %存在的最小灰度值
max = 256;
sum_low = zeros(256); %存放低于阈值的像素点数总和,用于计算平均灰度
sum_low_val = zeros(256); %存放低于阈值的像素值总和
for i = 1:256 %寻找存在的最小灰度值
if his(i) == 0
min = i;
else
break;
end
end
for i = 0:255 %寻找存在的最大灰度值
if his(256 - i) == 0
max = 256 - i;
else
break;
end
end
for i = min+1:max
sum = sum + his(i - 1);
valueSum = valueSum + his(i - 1)*(i - 1);
sum_low(i) = sum;
sum_low_val(i) = valueSum;
end
for i = min+1:max
low = sum_low(i) / sum;
high = 1- low;
ave_low = (sum_low_val(i) / sum_low(i));
ave_high = ((valueSum - sum_low_val(i)) / (sum - sum_low(i)));
g = (low * high * (ave_low - ave_high) * (ave_low - ave_high));
if g >= g_per
g_per = g;
thd = i;
else
break;
end
end
end
邻域边界跟踪法
该算法基于以下原理:边界像素通常具有与其邻域像素明显不同的属性,例如亮度、颜色或纹理等。通过比较像素之间的差异,我们可以识别出边界。
下面是邻域边界跟踪法的基本步骤:
选择一个起始点作为边界的一部分。
检查当前像素的邻域像素(例如,上、下、左、右四个方向)。
根据预定义的条件判断当前像素是否属于边界。这些条件可以是像素灰度差异、颜色差异或梯度值等。
如果当前像素符合条件,则将其标记为边界点,并将其添加到边界集合中。
移动到下一个邻域像素,重复步骤3和步骤4,直到回到起始点或无法找到满足条件的邻域像素。
如果回到起始点,则边界跟踪完成;否则,选择一个新的起始点并重复步骤2到步骤5,直到图像中的所有边界都被跟踪完毕。
通过这种方式,我们可以在图像中获取连通的边界像素,并将它们组织成边缘。通常,边界跟踪算法会将边界像素连接起来,形成封闭的边缘。
结果对比
在方法1中,原本的思路是每次在灰度图中选去一个点来进行种子生长,但每次选取的位置不同,会出现意料之外的事,比如选择了腔体内的点,结果,生长的区域却在腔体外。因此为了实现功能,最后选择了一个固定的点来进行种子生长,相应地,种子生长在错误区域的情况也并没有发生,较好地完成了实验。
在方法2中,采用传统的图像处理方法,先对原图像进行一系列图像增强的操作,再利用图像形态学的知识对其进行分割,最后用边缘检测算子提取边界。对比二者结果来看,区域生长方法提取的边界更贴合目标,但边缘相对来说不够平滑,还是有待改进,而传统算子提取的边界由于一些部分的灰度值是缓慢变化的,效果不够理想,如粉色圈出的部分。
传统算子提取的边界
区域生长提取的边界
方法三中,由于二值化后没有进行平滑滤波以及闭操作,出来的边界也呈现出锯齿状。但因为二值化阈值为人工选取,所以不会出现区域不连通等情况,且边界与原图的匹配性也很好。而且可以发现,对模糊大图像进行处理时,先将图像缩小进行计算,再将结果进行放大是没有什么影响的,反而可以提高计算的效率。
论文 代码 获取方式
点这里 只需要一点点辛苦费。