【实验七 图像的表示与描述(设计性)】

一、实验目的

1、掌握特征提取与表示方法;
2、学会编程实现图像的特征提取与表示;
3、能够根据实验结果分析各种算法的特点及其应用场合,培养处理实际图像的能力。

二、实验材料

1.文件夹
2.house.tif;Fig0320(a).tif;Fig1103(a)

三、实验内容(每一个内容编写一个*.m文件)

1、读入图像house.tif,用soble、LoG和Canny算子检测边缘,并采用Hough变换给出检测到的直线的参数和端点;

% 读入图像并显示
img = imread('house.tif');
figure;
subplot(2, 3, 1);
imshow(img);
title('原图像');

% Sobel算子检测边缘
sobel_x = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
sobel_y = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
sobel_x_img = imfilter(double(img), sobel_x);
sobel_y_img = imfilter(double(img), sobel_y);
sobel_img = sqrt(sobel_x_img.^2 + sobel_y_img.^2);
subplot(2, 3, 2);
imshow(sobel_img, []);
title('Sobel算子检测边缘');

% LoG算子检测边缘
log_filter = fspecial('log', [5, 5], 2);
log_img = imfilter(double(img), log_filter);
log_img = log_img/max(log_img(:));
subplot(2, 3, 3);
imshow(log_img);
title('LoG算子检测边缘');

% Canny算子检测边缘
canny_img = edge(img, 'canny');
subplot(2, 3, 4);
imshow(canny_img);
title('Canny算子检测边缘');

% Hough变换检测直线
[H, theta, rho] = hough(canny_img);
peaks = houghpeaks(H, 10);
lines = houghlines(canny_img, theta, rho, peaks);

% 在原图像上绘制检测到的直线
subplot(2, 3, [5, 6]);
imshow(img);
hold on;
for k = 1:length(lines)
   xy = [lines(k).point1; lines(k).point2];
   plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'green');
   plot(xy(1,1), xy(1,2), 'x', 'LineWidth', 2, 'Color', 'yellow');
   plot(xy(2,1), xy(2,2), 'x', 'LineWidth', 2, 'Color', 'red');
end
title('Hough变换检测直线');

2.读入一幅圆环图像Fig0320(a).tif,设计适当的方法,在Malab中编程实现对二值圆环的边缘与圆心的检测,要求得到完整的圆环边缘和确定的圆心位置坐标;

clc;
clear;
img = imread('Fig0320(a).tif');
subplot(2,2,1),imshow(img),title('原图');
BW = imbinarize(img);
subplot(2,2,2),imshow(BW),title('二值图像');
country = edge(BW,'Log');
subplot(2,2,3),imshow(country),title('Log算子');
[centers,radii,metric] = imfindcircles(country,[10 1000]);
figure();
imshow(img);
hold on;
viscircles(centers,radii,'EdgeColor','b');
disp("圆心坐标为:("+centers(1,1)+","+centers(1,2)+")");

3、读入图像Fig1103(a).tif,用matlab函数或编程获取物体边界的链码和一阶差分;

% 读入图像
img = imread('Fig1103(a).tif');

% 将图像转换为二值图像
binary_img = imbinarize(img);

% 获取物体边界的链码
boundary = bwboundaries(binary_img);
boundary = boundary{1}; % 假设只有一个物体,取第一个边界

% 计算链码
chain_code = diff(boundary, 1, 1); % 计算一阶差分

% 显示链码和一阶差分
figure;
subplot(1, 2, 1);
plot(boundary(:, 2), boundary(:, 1), 'r'); % 绘制边界
title('物体边界');
axis ij; % 调整坐标轴方向,使其与图像一致

subplot(1, 2, 2);
plot(chain_code(:, 2), chain_code(:, 1), 'b'); % 绘制链码
title('一阶差分');
axis equal; % 调整坐标轴比例

% 输出链码和一阶差分
disp('物体边界的链码:');
disp(chain_code);

四、问题与讨论

1、对实验中遇到的问题,进行分析讨论。

  • 图像边缘检测:

算法选择:Sobel、LoG和Canny算子是常用的图像边缘检测算法。它们各自有不同的特点和适用范围。Sobel算子对噪声比较敏感,LoG算子可以检测出更细的边缘,而Canny算子在实际应用中表现较好。
参数设置:不同算子的边缘检测结果受到参数设置的影响。例如,Canny算子需要设置合适的高低阈值,而Hough变换中的参数也会影响直线检测的准确性。
结果展示:在展示结果时,直线检测的可视化能够更直观地呈现出检测效果,有利于分析和讨论结果的准确性。

  • 圆环检测:

二值化处理:在进行圆环检测之前,需要将原始图像进行二值化处理,以便准确地检测圆环边缘。
参数设置:在使用imfindcircles函数时,需要设置合适的参数,如圆环半径范围、亮度极性和敏感度,以获得准确的检测结果。
结果展示:通过在图像上绘制检测到的圆环边缘和圆心位置,能够直观地展示检测结果,有助于分析和讨论检测的准确性。

  • 检测精度分析:

图像质量:图像质量对于边缘和圆环检测都至关重要。清晰、高对比度的图像有利于提高检测精度。
目标尺寸:较小的目标可能会导致检测精度下降,因为边缘检测和圆环检测需要足够的特征信息来进行准确的识别。
参数调整:在实际应用中,需要根据具体情况调整算法参数和阈值,以获得最佳的检测精度。

2、第二题中圆环半径和圆心坐标检测精度和哪些因素有关?

  • 图像质量:图像质量对于圆环边缘的检测至关重要。清晰、无噪声的图像可以提供更好的检测结果。
  • 圆环大小:圆环的尺寸越大,检测精度越高。较小的圆环可能会导致检测误差增加。
  • 参数设置:在使用imfindcircles函数时,参数的设置对检测结果也有影响。例如,半径范围、亮度极性和敏感度等参数的调整都会影响检测的准确性。
  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值