数字图像处理(三)

目录

实验六、图像分割方法

 实验七、图像识别与分类


实验六、图像分割方法

一、实验目的

  1. 了解图像分割技术相关基础知识;
  2. 掌握几种经典边缘检测算子的基本原理、实现步骤
  3. 理解阈值分割、区域分割等的基本原理、实现步骤。
  4. 理解分水岭分割方法的基本原理、实现方法。

二、实验环境

MATLAB 2014以上版本、Win 8\10\11 系统

三、实验原理

1.图像分割原理

图像分割是把图像分割成若干个特定的、具有独特性质的区域并提取出感兴趣的目标的技术和过程。在对图像的研究和应用中,人们往往仅对图像的某些部分感兴趣(目标或背景),一般对应图像中特定的、具有独特性质的区域。为了分析和识别目标,需要将这部分区域分割并提取出来。由于图像分割技术在当今图像工程的发展过程中起着十分重要的作用,得到了广泛应用,促使人们致力于寻找新的理论和方法来提高图像分割的质量,以满足各方面的需求。

涉及函数:imread、figure、imshow、subplot、rgb2gray、imwrite、edge、graythresh

四、实验内容

(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,分别使用Robert、Sobel、Canny、Laplacian算子检测图像边缘,并将原图及边缘检测结果显示在同一figure界面,比较检测结果异同。

clc;clear;close all;

I=imread('V.jpg');

gray_img = rgb2gray(I);

BW1=edge(gray_img,'Roberts',0.04);

BW2=edge(gray_img,'Sobel',0.04);

BW3=edge(gray_img,'Canny',0.04);

BW4=edge(gray_img,'log',0.04);

subplot(321),imshow(I),title('原图像')

subplot(323),imshow(BW1),title('Roberts检测图像')

subplot(324),imshow(BW2),title('Sobel检测图像')

subplot(325),imshow(BW3),title('Canny检测图像')

subplot(326),imshow(BW4),title('Laplacian检测图像')

(2)读取一张彩色图像,转换为灰度图,使用最大类间方差法分割图像,原图及分割结果显示在同一界面。

clc;clear;clear all;

% 读取彩色图像

color_img = imread('V.jpg');

% 转换为灰度图像

gray_img = rgb2gray(color_img);

% 最大类间方差法分割图像

threshold = graythresh(gray_img);

seg_img = imbinarize(gray_img, threshold);

% 显示原图及分割结果

figure;

subplot(1,2,1);

imshow(color_img);

title('原图');

subplot(1,2,2);

imshow(seg_img);

title('分割结果');

(3)读取一张彩色图像,使用区域生长法对图像进行分割,原图及分割结果显示在同一界面。

clc;clear;close all;

A0=imread('V.jpg');%读取图像

seed=[1,2];%选择起始位置

thresh=15;%相似性选择阈值

A=rgb2gray(A0);%灰度化

A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);

A=double(A);%将图像灰度化

B=A;

[r,c]=size(B);%r为行数,c为列

n=r*c;%计算图像包含点的个数

pixel_seed=A(seed(1),seed(2));%原图起始点灰度值

q=[seed(1),seed(2)];%q用来装载起始位置

top=1;%循环判断flag

M=zeros(r,c);%建立一个与原图大小一样的矩阵

M(seed(1),seed(2))=1;%将起始点赋为1,其余为0

count=1;%计数器

while top~=0 %循环结束条件

    r1=q(1,1);%起始点行位置

    c1=q(1,2);%起始点列位置

    p=A(r1,c1);%起始点灰度值

    dge=0;

    for i=-1:1%周围点循环判断

        for j=-1:1

           

            if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0%保证在点周围范围内

                if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1

                    top=top+1;%满足判定条件则top+1,top为多少,则q的行数有多少

                    q(top,:)=[r1+i,c1+j];%将满足判定条件的周围点位置赋予q,q记载了满足判定的每一外点

                    M(r1+i,c1+j)=1;%满足判定条件将M中相对应的点赋1

                    count=count+1;%统计满足条件的点个数,其实与top此时的值一样

                    B(r1+i,c1+j)=1;%满足判定条件将B中相对应点赋值1

                end

               

                if M(r1+i,c1+j)==0;%如果M中相对应的值为0,将dge赋值为1,也就是说这几个点不满足条件

                    dge=1;

                end

               

            else

                dge=1;%在图像外将dge赋值为1

            end

        end

    end

    %此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0

    if dge~=1

        B(r1,c1)=A(seed(1),seed(2));%将原图起始位置赋予B

    end

   

    if count>=n%如果满足判定条件的点个数大于等于n

        top=1;

    end

   

    q=q(2:top,:);

    top=top-1;

end

subplot(121),imshow(A,[]);

subplot(122),imshow(B,[]);

(4)读取一张彩色图像,使用一般分水岭算法对图像进行分割,原图及分割图像显示在同一界面。

clc;clear;close all;

% 读取彩色图像

image = imread('V.jpg');

% 将图像转换为灰度图像

gray_image = rgb2gray(image);

% 对灰度图像进行分水岭分割

segmented_image = watershed(gray_image);

% 将原图和分割图像显示在同一界面

figure;

subplot(1,2,1);

imshow(image);

title('原图');

subplot(1,2,2);

imshow(segmented_image);

title('分割图像');

 实验七、图像识别与分类

一、实验目的

  1. 了解图像识别与分类技术相关基础知识;
  2. 掌握几种图像特征提取方法的基本原理、实现步骤
  3. 了解图像识别与分类的基本原理、实现步骤。
  4. 掌握基础图像识别与分类任务设计方法,并编程实现。

二、实验环境

MATLAB 2014以上版本、Win 8\10\11 系统

三、实验原理

图像识别是指通过计算机对图像进行处理、分析和处理,以识别各种不同模式的目标和对象的技术,图像分类则是根据目标的不同特征基于分类器或判别器判别输入图像所属类别过程。图像的识别与分类是数字图像处理与分析领域中最为经典的应用与任务之一。

传统图像识别与分类方法基本流程如下:

涉及函数:imread、figure、imshow、subplot、rgb2gray、imwrite、imdilate、bwmorph、strel、imerode等

四、实验内容

(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用strel构造两个不同的结构元素,接着利用imdilate函数分别进行膨胀处理,并将原图及两个膨胀处理结果显示在同一figure界面。

clc;clear;close all;

I=imread('V.jpg');

J=rgb2gray(I);

se1=strel('ball',5,5);

se2=strel('octagon',3);

K1=imdilate(J,se1);

K2=imdilate(J,se2);

figure

subplot(131),imshow(I),title('原图像')

subplot(132),imshow(K1),title('膨胀结果1')

subplot(133),imshow(K2),title('膨胀结果2')

(2)从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用strel构造两个不同的结构元素,接着利用imerode函数分别进行腐蚀处理,并将原图及两个腐蚀处理结果显示在同一figure界面。

clc;clear;close all;

I=imread('V.jpg');

J=rgb2gray(I);

se1=strel('ball',5,5);

se2=strel('octagon',3);

K1=imerode(J,se1);

K2=imerode(J,se2);

figure

subplot(131),imshow(I),title('原图像')

subplot(132),imshow(K1),title('腐蚀结果1')

subplot(133),imshow(K2),title('腐蚀结果2')

(3)使用im2bw函数将下图转为二值图像,使用开运算先腐蚀后膨胀,分别提取图中的矩形块及线段,结果显示在同一figure,分别命名为“原始二值图像”、“矩形块提取结果”、“线段提取”。

 

clc;clear;close all;

% 读取图像

image = imread('a.jpg');

% 将图像转为二值图像

binary_image = im2bw(image);

% 创建一个新的figure,并将原始二值图像显示在第一个子图中

figure;

% 子图1:原始二值图像

subplot(1, 3, 1);

imshow(binary_image);

title('原始二值图像');

% 应用开运算进行腐蚀和膨胀

se = strel('square', 5); % 定义一个5x5的正方形结构元素

opened_image = imopen(binary_image, se);

% 子图2:矩形块提取结果

subplot(1, 3, 2);

imshow(opened_image);

title('矩形块提取结果');

% 提取线段

line_image = binary_image - opened_image;

% 子图3:线段提取结果

subplot(1, 3, 3);

imshow(line_image);

title('线段提取');

% 调整子图的布局

sgtitle('图像处理结果');

(4)将下图转为二值图像,并进行降噪、锐化处理,通过形态学运算提取轮廓,并进行计数。

 

clc;clear;close all;

% 读取图像

image = imread('b.jpg');

% 将图像转为灰度图像

grayImage = rgb2gray(image);

% 将灰度图像转为二值图像

binaryImage = imbinarize(grayImage);

% 降噪处理

denoisedImage = medfilt2(binaryImage);

% 锐化处理

sharpKernel = fspecial('unsharp');

sharpImage = imfilter(denoisedImage, sharpKernel, 'replicate');

% 形态学运算提取轮廓

se = strel('disk', 1); % 创建一个半径为1的圆形结构元素

morphImage = imtophat(sharpImage, se);

% 计数轮廓

[~, count] = bwlabel(morphImage);

% 显示处理结果

figure;

subplot(2, 2, 1);

imshow(binaryImage);

title('二值图像');

subplot(2, 2, 2);

imshow(denoisedImage);

title('降噪处理');

subplot(2, 2, 3);

imshow(sharpImage);

title('锐化处理');

subplot(2, 2, 4);

imshow(morphImage);

title('形态学运算提取轮廓');

% 显示轮廓数量

disp(['轮廓数量:', num2str(count)]);

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Mac 上安装 K8S

本篇文章将介绍如何在 Mac 上使用 minikube 搭建单机版的 Kubernetes。 安装步骤 安装 Docker 安装 docker 主要是用于提供容器引擎。直接下载安装即可。 下载地址 安装 Kubectl 推荐使用 home brew 安装 brew install kubectl可以使用下面的命令查看是否已经安装完毕 …

css实现鼠标悬停时滑出层提示

css实现鼠标悬停时滑出层提示的方法介绍 这是一个简单的鼠标悬停提示特效&#xff0c;类似于alt标签&#xff0c;不过这一种是用纯CSS实现&#xff0c;扩展性好&#xff0c;而且在提示的层里可以加入图片或其它布局&#xff0c;这个要根据你的需要了。 代码如下: <!DOCTYPE…

Flink基础概念及常识

1.flink入门 官方定义&#xff1a;Apache Flink是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算&#xff0c;Flink能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 简言之&#xff0c;Flink是一个分布式的计…

Spring相关API

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

[Spec] WiFi P2P Discovery

学习资料&#xff1a;Android Miracast 投屏 目录 学习资料&#xff1a;Android Miracast 投屏 P2P discovery Introduction Device Discovery procedures Listen State Search State Scan Phase Find Phase 总结 P2P discovery Introduction P2P发现使P2P设备能够快速…

SC7514运算放大器(OPA)可pin对pin兼容AD8694

SC751X 系列轨至轨 CMOS 运算放大器针对低电压单电源运行进行了优化。轨至轨输入和输出、低噪声(5nV/√Hz) 和高速运行 (38MHz, 22V/μs) 使得运算放大器非常适合驱动模数 (A/D) 转换器。可pin对pin兼容AD8694。而且也适用于手机功率放大器 (PA) 控制环路和视频处理(75Ω 驱动能…

如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari)

如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari) Chrome Chromium Edge Firefox Safari clear DNS Cache, flush DNS cache 请访问原文链接&#xff1a;https://sysin.org/blog/clear-browser-dns-cache/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

macOS FreeBSD 如何刷新 DNS 缓存

macOS FreeBSD 如何刷新 DNS 缓存 全文&#xff1a;如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接&#xff1a;https://sysin.org/blog/how-to-flush-dns-cach…

无迹卡尔曼滤波在目标跟踪中的作用(一)

在前一节中&#xff0c;我们介绍了扩展卡尔曼滤波算法EKF在目标跟踪中的应用&#xff0c;其原理是 将非线性函数局部线性化&#xff0c;舍弃高阶泰勒项&#xff0c;只保留一次项 &#xff0c;这就不可避免地会影响结果的准确性&#xff0c;除此以外&#xff0c;实际中要计算雅各…

机器学习李宏毅学习笔记36

文章目录 前言Meta learning应用总结 前言 Meta learning&#xff08;二&#xff09;应用方向 Meta learning应用 回顾gradient descen Θ0&#xff08;initial的参数&#xff09;是可以训练的&#xff0c;一个好的初始化参数和普通的是有很大差距的。可以通过一些训练的任务…

2 Prometheus 简介

目录 1. 起源 2. Prometheus 架构 2.1 指标收集 2.2 服务发现 2.3 聚合和警报 2.4 查询数据 2.5 服务自治 2.6 冗余和高可用性 2.7 可视化 3. Prometheus数据模型 3.1 指标名称 3.2 标签 3.3 采样数据 3.4 符号表示 3.5 保留时间 4. 安全模型 5. Prometheus生态…

Dubbo【Dubbo实战(用户更新业务消费者实现、用户删除业务消费者实现、复习内容) 】(六)-全面详解(学习总结---从入门到深化)

目录 Dubbo实战_用户更新业务消费者实现 Dubbo实战_用户删除业务消费者实现 复习内容&#xff1a; Dubbo实战_用户更新业务消费者实现 在Consumer中调用更新用户业务 /*** 根据用户id修改用户名字* param users* return*/Integer updateUsers(User users);/*** 根据用户id查…