图像分割和特征值计算

一、代码 

close all;
clc;
%读取图像
I = imread('cell_1.bmp');
whos I %显示出图像一个数组的附加信息
info = imfinfo('cell_1.bmp');%读取所有信息
[M N]=size(I); %确定一幅图像的行数和列数
No=numel(I); %确定一幅图像的像素数目,即矩阵(数组)的元素数目
% 显示所有详细信息
disp(info);
%显示原始图像
figure;
imshow(I);
title('原始图像');
% 显示图像的直方图
figure;
imhist(I);
title('灰度直方图');
% 确定阈值
T = graythresh(I);
% 根据阈值进行图像分割
J = imbinarize(I, T);
%显示阈值分割后的图像
figure;
imshow(J);
title('阈值分割后的图像');
%轮廓提取 应用Canny检测
cannyEdges = edge(J, 'canny');
% 显示Canny边缘检测结果
figure;
imshow(cannyEdges);
title('Canny轮廓提取');
% 标记图像中的联通区域;Canny结果用于联通区域标记
L4 = bwlabel(cannyEdges, 8);
%轮廓提取sobel
a=edge(J,'roberts',T);
b=edge(J,'sobel',T);
c=edge(J,'prewitt',T);
%标记图像中的联通区域;BW为二值图像;n为所选邻域(4邻域或8邻域)
L1 = bwlabel(a, 8);
L2= bwlabel(b, 8);
L3= bwlabel(c, 8);
%显示阈值分割后的图像
figure;
imshow(a);
title('robert轮廓提取');
%显示阈值分割后的图像
figure;
imshow(b);
title('sbobel轮廓提取');
%显示阈值分割后的图像
figure;
imshow(c);
title('prewitt轮廓提取');
% Laplacian
L = fspecial('laplacian', 0.2);
laplacianFiltered = imfilter(double(J), L, 'replicate');
% LoG
sigma = 2; % 高斯模糊的标准差
h = fspecial('log', [5 5], sigma);
logFiltered = imfilter(double(J), h, 'replicate');
% 显示Laplacian边缘检测结果
figure;
imshow(laplacianFiltered, []);
title('Laplacian轮廓提取');
% 显示LoG边缘检测结果
figure;
imshow(logFiltered, []);
title('LoG轮廓提取');

% 参数计算
d = regionprops(J, 'area');
e = regionprops(J, 'Perimeter');
f = regionprops(J, 'Centroid');

算法原理:

主要用于图像处理,特别是用于处理名为'cell_1.bmp'的位图图像中的细胞分析。以下是代码各部分及其功能的详细解释:
读取图像及信息获取:
使用 imread 函数加载图像,whos 和 imfinfo 函数显示图像的属性和详细信息。
通过 size 和 numel 函数获取图像的尺寸和像素总数。
显示图像:
显示原始图像及其灰度直方图。直方图有助于分析图像中的灰度值分布。
图像二值化与分割:
使用大津法 (graythresh) 自动确定阈值来对图像进行二值化处理。二值化是将图像转换为黑白两色,便于进一步处理。随后显示二值化后的图像。
边缘检测:
应用Canny算法进行边缘检测。Canny算法是一种流行的边缘检测方法,能有效识别图像中的边缘。
使用Roberts, Sobel, Prewitt边缘检测方法,这些都是用于捕捉图像中的边缘的常见算法。每种方法都有其特点,例如Sobel对垂直和水平边缘较敏感。
显示这些算法的边缘检测结果。
Laplacian 和 LoG (Laplacian of Gaussian) 滤波:
使用Laplacian滤波器进行边缘检测,这是一种二阶导数方法,对灰度突变敏感。
LoG结合了高斯平滑和Laplacian边缘检测,通常用于去噪同时检测边缘。
显示这些滤波方法的边缘检测结果。
参数计算:
计算图像中各连通区域的面积、周长和质心。这些参数有助于分析图像中的对象特性。

二、代码

close all;
clc;
% 读取图像
I = imread('cell_1.bmp');
info = imfinfo('cell_1.bmp'); % 读取所有信息
disp(info); % 显示所有详细信息
% 显示原始图像
figure;
imshow(I);
title('原始图像');
% 显示图像的直方图
figure;
imhist(I);
title('灰度直方图');
% 确定阈值并进行图像分割
T = graythresh(I);
J = imbinarize(I, T);
% 显示阈值分割后的图像
figure;
imshow(J);
title('阈值分割后的图像');
% 应用Canny检测进行轮廓提取
E = edge(J, 'canny');
% 显示Canny边缘检测结果
figure;
imshow(E);
title('Canny轮廓提取');
% 标记图像中的联通区域;Canny结果用于联通区域标记
L = bwlabel(E, 8);
% 光栅扫描边缘跟踪
% 找到起始位置
[rows, cols] = size(E);  % 获取矩阵的行数和列数
m = -1;  % 初始化行索引
n = -1;  % 初始化列索引
for j = 1:cols  % 遍历列
    for i = 1:rows  % 遍历行
        if E(i, j) ~= 0  % 检查元素是否非零
           m = i;  % 更新行索引
           n = j;  % 更新列索引  
         end
     end
end
% 初始化方向数组和当前位置
% directions = [0 -1; -1 -1; -1 0; -1 1; 0 1; 1 1; 1 0; 1 -1]; % 8个方向
directions = [0 -1; -1 0;  0 1;  1 0]; % 4个方向
current_row = m;
current_col = n;    
boundary = [current_row, current_col]; % 保存边界点
start_col = n; % 边界重新进行初始化
% 循环,直到回到起始点
found = true; % 初始化为true以进入循环
while found
    found = false;
    for k = 1:4
        test_row = current_row + directions(k, 1);
        test_col = current_col + directions(k, 2);
        if E(test_row, test_col) % 找到下一个前景像素
            current_row = test_row;
            current_col = test_col;
            boundary = [boundary; current_row, current_col];
            found = true;
            break;
        end
    end
    % 如果完成一圈回到起点,停止
    if current_row == m && current_col == start_col
        break;
    end
end
% 显示边界跟踪结果
figure;
imshow(J); hold on;
plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2);
title('轮廓追踪的结果');
% 创建一个新的灰度图像用于显示不同的联通区域
max_label = max(L(:)); % 获取最大的标记值
grayscaleMap = linspace(0, 255, max_label+1); % 创建等间隔的灰度级
L_gray = uint8(zeros(size(L))); % 初始化灰度图像
% 为每个联通区域分配不同的灰度级
for k = 1:max_label
    L_gray(L == k) = grayscaleMap(k+1);
end
% 显示带有不同灰度级联通区域的图像
figure;
imshow(L_gray);
title('不同灰度级的联通区域');

二、算法原理

自编程函数实现的光栅扫描图像分割

针对细胞图像进行处理,从基本的读取和显示,到复杂的边缘检测和轮廓追踪。下面将逐步介绍各个部分的算法原理:

读取和显示图像及其直方图:
使用 imread 读取位图文件,imfinfo 获取并显示图像的元信息。
imshow 显示原始图像。
imhist 显示图像的灰度直方图,帮助理解图像的灰度分布,为接下来的图像处理提供参考。
自动阈值确定与图像分割:
graythresh 使用大津法(Otsu's method)自动计算图像的最佳阈值。这种方法通过最大化类间方差来选择阈值,有效分离前景和背景。
imbinarize 根据大津法得到的阈值将图像转换为二值图像,即图像中的像素点非黑即白。
Canny边缘检测:
edge 使用Canny算法检测图像中的边缘。Canny边缘检测算法是一种多阶段算法,优点是具有低错误率,能准确地检测到图像中的边缘,并且边缘较薄。
联通区域标记:
bwlabel 用于标记二值图像中的连通区域。每个连通区域分配一个唯一标签,便于进一步分析。
光栅扫描边缘跟踪:
通过遍历图像矩阵找到第一个非零元素作为起始点。
使用一个简化的方向数组(只考虑4个主方向)进行边缘跟踪,记录边界点。
循环跟踪直到回到起点,完成边界的闭环。
显示边界跟踪结果:
使用 plot 在二值化图像上绘制检测到的边界,以红色线条显示。
灰度图像显示不同联通区域:
根据连通区域的标签数生成不同的灰度级,每个连通区域分配一个特定的灰度值。
这样做可以直观地区分和识别图像中的不同区域。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值