数字图像处理(三)

news2024/11/23 3:45:41

目录

实验六、图像分割方法

 实验七、图像识别与分类


实验六、图像分割方法

一、实验目的

  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.coloradmin.cn/o/663816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

清华大学实验室走在科研管理前沿,与Zoho合作推进新模式

在教育科研工作中&#xff0c;在重视科研的同时&#xff0c;也不能忽略科研管理的重要性。做好教育科研的管理工作&#xff0c;可以有效提高科研工作的效率和质量。项目管理软件可以帮助教育科研团队更加高效地管理项目&#xff0c;并且简化团队成员之间的协作和沟通&#xff0…

【玩转Docker小鲸鱼叭】理解Docker的核心概念

Docker核心概念 Docker有三大核心概念&#xff1a;镜像&#xff08;Image&#xff09;、容器&#xff08;Container&#xff09;、仓库&#xff08;Repository&#xff09; 1、镜像&#xff08;Image&#xff09; Docker镜像 是我们创建和运行Docker容器的基础&#xff0c;它…

青大数据结构【2019】【三分析计算】

关键字: 邻接表时间复杂度、哈希表、平均查找长度ASL、堆排序 邻接表表示法 在邻接表上执行图的遍历操作时,需要对邻接表中所有的边(链表中的结点)访问一次,还需要对所有的顶点访问一次,故时间代价为O(n+2)。 1) 散列序号 0 1 2 3 4 5 6 7 元素 19 15 8 5 13 20

奉加微电子PhyPlusKit软件怎么使用

摘要&#xff1a;本文简介使用奉加微电子PhyPlusKit软件清除芯片、制作hexf文件、烧录程序、串口调试等操作方法。 所用硬件&#xff1a; PHY6222开发板&#xff0c;这个开发板上自带了CP210X串口芯片&#xff0c;与电脑的接口的type-c&#xff0c;既可以供电&#xff0c;又可…

探索Gradio Interface的强大功能与无限可能性——launch方法介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

记录一个iOS头部放大计算

视图层级&#xff1a;由于这是在原有的视图层级的基础上完成的放大功能&#xff0c;所以记录了一下计算方法&#xff0c; tableview 和 放大的背景图片都是self.view的子视图&#xff0c;下拉的时候要方法&#xff0c;上滑的时候要同步上移图片 核心代码 [self.view addSubview…

回了一趟老家,我发现老家没有想象中那么舒服!

大家好&#xff0c;我是千与千寻&#xff0c;千寻最近回了一趟老家&#xff0c;说到回老家&#xff0c;我相信说应该大部人觉得是很舒服&#xff0c;自己很满意的生活节奏与感觉。 但是千寻在老家的这一个星期&#xff0c;感受到了非常多的不舒适&#xff0c;希望和星友们聊聊看…

三极管选型

来源网络&#xff0c;仅作笔记 三极管如何选型? 应根据电路的实际上需选取三极管的类别&#xff0c;即三极管在电路中的效用应与所选三极管的机能相吻合。 三极管的品种很多&#xff0c;分类的方式也不同&#xff0c;一般按半导体导电特点分成NPN型与PNP型两大类;按其在电路中…

zabbix-2-创建自定义监控项

例如监控iostat 下的sda tps值 [rootnode1 ly]# iostatLinux 3.10.0-1160.53.1.el7.x86_64 (node1) 2023年06月13日 _x86_64_ (32 CPU)avg-cpu: %user %nice %system %iowait %steal %idle0.06 0.00 0.04 0.01 0.00 99.89Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 1…

网工内推 | 金融业网工专场,员工旅游,带薪年假,节日福利

01 银信科技 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1&#xff09; 负责分支机构筹建网络系统调试与部署工作、网络运维管理及问题处理支持&#xff1b; 2&#xff09; 处理外部代理点系统及网络问题协助支持&#xff1b; 3&#xff09; 负责网络日志平台监控及…

PyCharm安装教程(图文结合,超详细,小白安装必看)

PyCharm安装教程(图文结合&#xff0c;超详细&#xff0c;小白安装必看) 一、Python开发环境 PyCharm集成开发工具&#xff08;IDE&#xff09;&#xff0c;是当下全球Python开发者&#xff0c;使用最频繁的工具软件。 绝大多数的Python程序&#xff0c;都是在PyCharm工具内…

python控制台学生管理系统

代码与注释 具体功能说明 设计初始界面设计学生信息录入 【数据校准】录入判断 学生姓名不能为空&#xff0c;并且不成超过4个字【数据校准】录入判断年龄在0-120 需要进行判断【数据校准】录入需要判断学号是否为空与学号是否在10位数【数据校准】录入需要判断成绩是否在0-1…

python数据分析-Mysql中NULL和‘ ‘怎么处理(不使用update)

一、空值NULL和空字符’ ’ 展示代码使用的版本是&#xff1a;8.0.28 空值NULL的长度是NULL&#xff0c;是占用存储空间的。空字符串’ 的长度是0&#xff0c;是不占用空间的。 理解&#xff1a;空字符串就像是一个真空状态的杯子&#xff0c;什么都没有;而空值NULL_就像是一…

17-事件循环(实现单线程非阻塞的方法就是事件循环)

一、是什么 &#x1f9c0;&#x1f9c0;&#x1f9c0;首先&#xff0c;JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;但是这并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻塞的方法就是事件循环 在JavaScript中&#xff0c;所有…

Vue路由模式

1. vue路由简介和基础使用 1.1 什么是路由 设备和ip的映射关系 接口和服务的映射关系 路径和组件的映射关系 1.2 为什么使用路由&#xff1f; 在一个页面里, 切换业务场景&#xff0c;具体使用示例: 网易云音乐 网易云音乐 单页面应用(SPA): 所有功能在一个html页面上实现 前…

虚拟内存(Virtual Memory)

什么是虚拟内存&#xff1f; 虚拟内存(Virtual Memory) 是计算机系统内存管理非常重要的一个技术&#xff0c;本质上来说它只是逻辑存在的&#xff0c;是一个假想出来的内存空间&#xff0c;主要作用是作为进程访问主存&#xff08;物理内存&#xff09;的桥梁并简化内存管理。…

.NET的AsyncLocal用法指南

AsyncLocal用法简介 通过 AsyncLocal 我们可以在一个逻辑上下文中维护一份私有数据&#xff0c;该上下文后续代码中都可以访问和修改这份数据&#xff0c;但另一个无关的上下文是无法访问的。 无论是在新创建的 Task 中还是 await 关键词之后&#xff0c;我们都能够访问前面设…

开关电源——三种基本拓扑

开关电源——三种基本拓扑 开关电源基本原理——伏秒数法则与占空比 当电路是稳态电路的时候&#xff0c;有限的输入对应有限的输出&#xff0c;即电路不再积累能量&#xff0c;电感积累的能量是电压对时间的积分&#xff0c;在开关电源电路中&#xff0c;电感在开关导通和截…

06- c语言预处理 (C语言)

一 预处理概述 1、前面各章中&#xff0c;已经多次使用过 #include 命令。使用库函数之前&#xff0c;应该用#include引入对应的头文件。这种以 #号开头的命令 称为预处理命令。 2、C语言提供了多种预处理功能&#xff0c;如 宏定义、文件包含、条件编译 等。合理地使用预处理…

web漏洞-反序列化之PHPJAVA全解(上)(37)

这个很重要 为什么会产生这个东西&#xff1a;序列化之后便于我们对象的传输和保存&#xff0c;这个作用就是为了数据的传递和格式的转换&#xff0c;我们称之为序列化。 在这给过程中&#xff0c;会涉及到一种叫做有类和无类的情况&#xff0c;开发里面经常看到的一个东西&a…