💥1 概述

近年我国胸部疾病感染者的数量急剧增加。世界卫生组织报告显示,我国胸部类疾病患者数量在全球位列第一,并且还统计出国内肺癌的发病率、死亡率在所有的癌症中都是极高的。胸部疾病已经成为一个非常大的威胁。为了实现对病人胸部CT图片有效分割,提高分割效率,本文提出一种基于最小误差的图像分割方法。该方法使用统计学的原理,对图像的直方图进行处理。一维最小误差阈值法假设了目标和背景的灰度分布服从混合正态分布。考虑到噪声等因素对图像质量的影响,在二维灰度直方图上,基于二维混合正态分布假设,给出一维最小误差阈值法的二维推广表达式,为了提高算法的运行速度。也给出了快速递推算法。实验表明,二维最小误差阈值法是一个有效的图像分割算法,能够更好地适应目标和背景方差相差较大的图像及噪声图像的分割问题。图像处理中的基础和重要步骤是图像分割。近年来,图像分割方法中加入了各种新的技术和新的理论,并创造了许多新的图像分割方法。图像分割改进的目的是提高图像分割结果的准确性和算法的有效性。计算机辅助检测技术中X线胸片肺部区域分割和腹部CT图像的肝脏组织分割是较为常见的医学诊断技术,对医学图像的研究分析有着重大的意义。

📚2 运行结果

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_matlab

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_图像分割_02

 

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_matlab_03

 

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_图像分割_04

 

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_matlab_05

 

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_图像分割_06

 

基于最小误差法的图像分割python实现 最小误差阈值原理步骤_计算机视觉_07

 部分代码:

clc; clear all; close all;
 warning off all;
 % 读取图像
 filename = fullfile(pwd, 'images/test.jpg');
 Img = imread(filename);
 % 灰度化
 if ndims(Img) == 3
     I = rgb2gray(Img);
 else
     I = Img;
 end
 % 直接二值化
 bw_direct = im2bw(I);
 figure; imshow(bw_direct); title('直接二值化分割');
 % 圈选胃区域空气
 c = [1524 1390 1454 1548 1652 1738 1725 1673 1524];
 r = [1756 1909 2037 2055 1997 1863 1824 1787 1756];
 bw_poly = roipoly(bw_direct, c, r);
 figure;
 imshow(I, []);
 hold on;
 plot(c, r, 'r-', 'LineWidth', 2);
 hold off;
 title('胃区域空气选择');
 % 设置胃内空气为255
 J = I;
 J(bw_poly) = 255;
 % 图像增强
 J = mat2gray(J);
 J = imadjust(J, [0.532 0.72], [0 1]);
 J = im2uint8(mat2gray(J));
 figure; imshow(J, []); title('图像增强处理');
 % 直方图统计
 [counts, gray_style] = imhist(J);
 % 亮度级别
 gray_level = length(gray_style);
 % 计算各灰度概率
 gray_probability  = counts ./ sum(counts);
 % 统计像素均值
 gray_mean = gray_style' * gray_probability;
 % 初始化
 gray_vector = zeros(gray_level, 1);
 w = gray_probability(1);
 mean_k = 0;
 gray_vector(1) = realmax;
 ks = gray_level-1;
 for k = 1 : ks
     % 迭代计算
     w = w + gray_probability(k+1);
     mean_k = mean_k + k * gray_probability(k+1);
     % 判断是否收敛
     if (w < eps) || (w > 1-eps)
         gray_vector(k+1) = realmax;
     else
         % 计算均值
         mean_k1 = mean_k / w;
         mean_k2 = (gray_mean-mean_k) / (1-w);
         % 计算方差
         var_k1 = (((0 : k)'-mean_k1).^2)' * gray_probability(1 : k+1);
         var_k1 = var_k1 / w;
         var_k2 = (((k+1 : ks)'-mean_k2).^2)' * gray_probability(k+2 : ks+1);
         var_k2 = var_k2 / (1-w);
         % 计算目标函数
         if var_k1 > eps && var_k2 > eps
             gray_vector(k+1) = 1+w * log(var_k1)+(1-w) * log(var_k2)-2*w*log(w)-2*(1-w)*log(1-w);
         else
             gray_vector(k+1) = realmax;
         end
     end
 end
 % 极值统计
 min_gray_index = find(gray_vector == min(gray_vector));
 min_gray_index = mean(min_gray_index);
 % 计算阈值
 threshold_kittler = (min_gray_index-1)/ks;
 % 阈值分割
 bw__kittler = im2bw(J, threshold_kittler);
 % 显示
 figure; imshow(bw__kittler, []); title('最小误差法分割');
 % 形态学后处理
 bw_temp = bw__kittler;
 % 反色
 bw_temp = ~bw_temp;
 % 填充孔洞
 bw_temp = imfill(bw_temp, 'holes');
 % 去噪
 bw_temp = imclose(bw_temp, strel('disk', 5));
 bw_temp = imclearborder(bw_temp);
 % 区域标记
 [L, num] = bwlabel(bw_temp);
 % 区域属性
 stats = regionprops(L);
 Ar = cat(1, stats.Area);
 % 提取目标并清理
 [Ar, ind] = sort(Ar, 'descend');
 bw_temp(L ~= ind(1) & L ~= ind(2)) = 0;
 % 去噪
 bw_temp = imclose(bw_temp, strel('disk',20));
 bw_temp = imfill(bw_temp, 'holes');
 figure;
 subplot(1, 2, 1); imshow(bw__kittler, []); title('待处理二值图像');
 subplot(1, 2, 2); imshow(bw_temp, []); title('形态学后处理图像');
 % 提取肺边缘
 ed = bwboundaries(bw_temp);
 % 显示
 figure;
 subplot(2, 2, 1); imshow(I, []); title('原图像');
 subplot(2, 2, 2); imshow(J, []); title('增强图像');
 subplot(2, 2, 3); imshow(bw_temp, []); title('二值化图像');
 subplot(2, 2, 4); imshow(I, []); hold on;
 for k = 1 : length(ed)
     % 边缘
     boundary = ed{k};
     plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 2);
 end
 title('肺边缘显示标记');
 figure;
 subplot(1, 2, 1); imshow(bw_temp, []); title('二值图像');
 subplot(1, 2, 2); imshow(I, []); hold on;
 for k = 1 : length(ed)
     % 边缘
     boundary = ed{k};
     plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 2);
 end
 title('肺边缘显示标记');

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]赵蓉. 基于深度学习的图像分割算法应用研究[D].南京邮电大学,2022.DOI:10.27251/d.cnki.gnjdc.2022.001006.

[2]赵婧秋. 复杂条件下基于形状特征的图像检索[D].西安电子科技大学,2019.DOI:10.27389/d.cnki.gxadu.2019.001818.

🌈4 Matlab代码实现