文章目录

  • 一、Matlab安装及题目
  • 二、使用HSV色彩空间进行颜色阈值分割
  • 三、简单分割实现

一、Matlab安装及题目

最近有一个数字图像处理的实验课,我们组准备选一个有关图像分割的题目。这里把我们组的一些思路及首先记录下。

首先自然是matlab的安装了,网上有很多的安装包,但是大部分都是百度网盘的,我超级不喜欢百度网盘。所以我直接给一个matlab7.0浏览器下载的链接:
https://dl.pconline.com.cn/download/360588.html

解压安装后,对于window10操作系统,请右键Matlab.exe文件,选择属性,兼容性,以兼容模式运行该程序:


Matlab7.0是比较老的版本了,没有自动补全等功能,如果是长期使用还是推荐取网上下载新版本。

然后题目如下:

二、使用HSV色彩空间进行颜色阈值分割

一种简单的方法是使用颜色的数值不同进行划分,颜色相近的点分到一张图片里面,那么我们直接用RGB三通道划分吗?自然可以,但是我们先尽可能考虑简单情况吧(你也可以说我太菜 / W \)

三维的划分不容易,一维的容易不少,我们可以使用灰度图,然后弄出它的直方图再说。

不过可以注意到,我们要划分的图像,大都颜色近似。那么可以用一种可能更好的方式,这里我们就要介绍HSV色彩空间了。它如下图所示:


这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
H用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°, 蓝色为240°。它们的补色是:黄色为60°,青色为180°, 品红为300°;

因为HSV非常符合人的观察模式,S和V通道对颜色的归类影响不太大,所以可以直接用H通道。

因此我们将原本的灰度图的直方图变成H通道的直方图。

这里我们先实现一个函数(请无视函数名),传入参数为图像I,
第一步、读取图片,得到h通道。
第二步、绘制HSV彩带方便对比查看。(可选)
第三步、计算频率,准备绘制直方图。
第四步、特殊处理,作用就是放大一些凸点。(可选)

function [hsv,res]=Untitled(I)
% 1.读取图片并转换为HSV图像模型
hsv = rgb2hsv(I);%RGB转hsv
h = hsv(:,:,1);
h = h(:)*360;  % 因为h通道为0-1,所以乘360% 2.画hsv颜色分量
for i=1:360tempx = 1-abs(mod(i/60,2)-1);if i<60plot(i,0,'*','color',[1 tempx 0],'MarkerSize',20);elseif i<120plot(i,0,'*','color',[tempx 1 0],'MarkerSize',20);elseif i<180plot(i,0,'*','color',[0 1 tempx],'MarkerSize',20);elseif i<240plot(i,0,'*','color',[0 tempx 1],'MarkerSize',20);elseif i<300plot(i,0,'*','color',[tempx 0 1],'MarkerSize',20);elseplot(i,0,'*','color',[1 0 tempx],'MarkerSize',20);end   hold all;
end% 3.画hsv频率曲线
res = linspace(0,0,361);
for i=1:length(h)if res(round(h(i))+1) < 10000 % 限制一下res(round(h(i))+1) =  res(round(h(i))+1) + 1;end
end% 4.特殊处理,放大odd像素
for i=2:360if res(i) > res(i+1)+700 && res(i) > res(i-1)+700res(i) = 5*res(i);if res(i) > 10000res(i) = 10000;endend
endplot(res,'LineWidth', 2);
grid on;

记得文件名和函数名一致,然后我们来测试一下。
在command window输入下面的代码,选择图片,然后调用函数。

[fn,pn,fi]=uigetfile({'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...'*.*','All Files' },'mytitle',...'C:\Work\myfile.jpg');
I = imread([pn fn]);
[hsv,res]=Untitled(I);


可以从直方图看到,明显看到这一张照片的绿色和蓝色还有红色比较多。我输入的图片如下:

之前的特殊处理的用处就是对于像蓝色这样的像素点比绿色少很多,所以对这样的像素放大。
这样我们就得到了一张直方图,怎么分呢?通过人眼,应该已经可以大致划几条竖线分割了吧。
比如这样(实际情况会有区别,虽然有够难看的),分成四部分,那么用matlab怎么实现呢?

三、简单分割实现

一个简单的方法就是画一条横线,把超过这条横线的区间记录下来,根据这个区间进行划分。
我们再定义一个函数,传入上面函数得到的hsv,res以及一个阈值flag,我们那一条横线的值就是flag了。
第一步、根据设定的flag分类,获取区间传入res2中,就是计算那些我画的小红点了。

第二步、就是对区间相距太近的进行合并。
第三步、从左到右计算每一个区间右边界和下一个区间的左边界取中值。
比如:处理前的区间是0 1和30 31,那么就化为0 (1+30)/2和(1+30)/2 31,所以结果如下所示:
res2 =

 0     1
30    31
60    61
67    68
85    90

res2 =

 0    16
16    46
46    64
64    77
77   360

第四步、根据上面的结果绘制分割图。代码如下:

function []=Step2(hsv,res,flag)
temp_hsv = hsv;
% 1.根据设定的频率系数,分类
plot([0 360],[flag flag],'g--','LineWidth', 2);% 2,获取区间传入res2中
left = 0;
flag_temp = 0;  % 0表示还没有进入区间
res2 = [];
for i=1:length(res)if res(i) > flagif flag_temp == 0left = i;flag_temp = 1;endelse if flag_temp == 1res2 = [res2;left-1,i-1];flag_temp = 0;endend
end% 间距小的合并
i = 1;
res3 = [];
while i<=length(res2(:,1))-1% 小于12的间隔进行合并temp_left = res2(i,1);while i<=length(res2(:,1))-1 && res2(i+1,1) - res2(i,2) < 5i=i+1;endres3 = [res3;temp_left,res2(i,2)];i=i+1;
end
res2 = res3;
% 取中值划分
for i=1:length(res2(:,1))if i==1res3(i,1) = 0;res3(i,2) = round((res2(i,2)+res2(i+1,1))/2);elseif i==length(res2(:,1))res3(i,1) = round((res2(i-1,2)+res2(i,1))/2);res3(i,2) = 360;elseres3(i,1) = round((res2(i-1,2)+res2(i,1))/2);res3(i,2) = round((res2(i,2)+res2(i+1,1))/2);end
end
length(res3(:,1))
res2 = res3;
% 3. 开始分割
figure;
for i=1:length(res2(:,1))hsv = temp_hsv;temp_interval = res2(i,:);sum = 0;for row=1:length(hsv(:,1,:))for col=1:length(hsv(1,:,:))temp_num = round(hsv(row,col,1)*360);if temp_interval(1) <= temp_num && temp_num <= temp_interval(2);   % 选中的像素处理elsehsv(row,col,1) = 0;     % 未选中像素处理,白色hsv(row,col,2) = 0;hsv(row,col,3) = 1;endendendNEW = hsv2rgb(hsv);% subplot(1,length(res2(:,1)),i);figure(i); imshow(NEW);
end

结果如下,虽然还是不太理想,但是还阔以:

自己Matlab程序写得少,肯定上面的代码还有matlab相关的简单写法,但是思想是一样的(把Matla活生生用成了C),如果有更好的实现方法欢迎指正。

那有没有更好的方法呢?答案是有的,下一篇文章讲解OpenCv方法实现图像分割,用到的技术是超像素SLIC方法、kmean分类,不要被吓到了,实现可能会难一点,但是超级容易理解。

【OpenCv3】 VS C++ (五):SLIC超像素分割算法:

https://blog.csdn.net/qq_40515692/article/details/102750516

Matlab 简单图像分割实战相关推荐

  1. 图像隐藏matlab代码,picture Matlab简单操作实现图像的隐藏加密 联合开发网 - pudn.com...

    picture 所属分类:其他 开发工具:Others 文件大小:15KB 下载次数:1 上传日期:2018-07-18 09:50:48 上 传 者:至尊宝物语 说明:  Matlab简单操作实现图 ...

  2. matlab统计所有股票分析,MATLAB金融算法分析实战:基于机器学习的股票量化分析...

    MATLAB金融算法分析实战:基于机器学习的股票量化分析 作者:吴婷;余胜威 编著 出版日期:2017年07月 文件大小:32.24M 支持设备: ¥50.00在线试读 适用客户端: 言商书局 iPa ...

  3. 《MATLAB金融算法分析实战》之量化投资趋向指标1— python实现

    <MATLAB金融算法分析实战>之量化投资趋向指标1- python实现 这本书我个人比较喜欢,也学习到了很多东西,matlab上学的时候没好好学,最近发现python写一遍也很有意思,除 ...

  4. Keras图像分割实战:数据整理分割、自定义数据生成器、模型训练

    Keras图像分割实战:数据整理分割.自定义数据生成器.模型训练 目录 Keras图像分割实战:数据整理分割.自定义数据生成器.模型训练

  5. python爬虫使用模块_10分钟教你Python爬虫(下)--爬虫的基本模块与简单的实战...

    本文来源于公众号[程序猿声],作者向柯玮 前言 各位看客老爷们,新年好.小玮又来啦.这次给大家带来的是爬虫系列的第二课---爬虫的基本模块与简单的实战. 说到爬虫的基本模块,不知道大家之前有没有了解过 ...

  6. BP神经网络(Back Propagation Neural Network)Matlab简单实现

    BP神经网络(Back Propagation Neural Network)Matlab简单实现 前言 简单了解反向传播(Backwarod Propagation)机制(链式法则) 实例分析 前向 ...

  7. 第 09 章 基于特征匹配的英文印刷字符识别 MATLAB深度学习实战案例

    基于特征匹配的英文印刷字符识别 MATLAB深度学习实战 话不多讲,直接开撸代码 MainForm函数 function MainForm global bw; global bl; global b ...

  8. 手把手MATLAB 简单连续信号表示 指数 正弦 抽样 矩形 三角波 信号

    MATLAB 简单连续信号表示 指数 正弦 抽样 矩形 三角波 信号 开头想法:因为今天刚考完玩信号与系统,感觉自己学到的东西特别的空洞,所以将自己又将实验重新做一次,加深理解,希望温故而知新!下面进 ...

  9. 图像分形的matlab算法,基于MATLAB的图像分割算法研究

    内容介绍 原文档由会员 花季永驻 发布 基于MATLAB的图像分割算法研究 全文54页 约28000字 论述翔实 摘 要 本文从原理和应用效果上对经典的图像分割方法如边缘检测.阈值分割技术和区域增长等 ...

  10. 贾志刚OpenCV3.2图像分割实战学习笔记

    OpenCV图像分割资料分享:贾志刚的OpenCV图像分割实战视频教程全套资料(包含配套视频.配套PPT的PDF文件.源码和用到的图片素材等):点这里 目录: 实例1:读取单张JPG图像(测试环境) ...

最新文章

  1. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
  2. Licia:最全最实用的 JavaScript 工具库
  3. 方舟手游服务器设置文件翻译,方舟生存进化手游界面翻译 方舟生存进化手机版中文对照翻译一览...
  4. hibernate 数据源配置文件
  5. jstack调试_增压的jstack:如何以100mph的速度调试服务器
  6. beoplay耳机序列号查询_BO Beoplay E8评测:真正无线耳机,可自定义EQ设置和透明模式!...
  7. zypper 工具详解
  8. Android JNI使用方法,JNI机制详解
  9. 微商公社新兵连第一天
  10. 计算机专业英语常用词汇整理
  11. 使用PMOS管构建电源延时供电电路
  12. system-config-network
  13. 导航上显示某个地点已关闭什么意思_想要玩好iPhone手机,6个关闭、4个开启,要牢记...
  14. 有序的map LinkedHashMap
  15. 数据结构-KMP手算next与nextval(全网最简单,包会)
  16. Linux设置软件开机自启动的三种方式(中标麒麟、银河麒麟、ubuntu)
  17. 什么是Use Case?
  18. Python使用asyncio+aiohttp异步爬取猫眼电影专业版
  19. MySQL学习整理-码农进阶之路(二)
  20. WLAN无线适配器未连接

热门文章

  1. CAD迷你画图2020R11
  2. 关于brvah的setEmptyView功能无法显示问题
  3. Python excel转txt文件
  4. 获取汉字的拼音简码方法(仅适用于国标一级汉字)
  5. esp32 esp8285 wf6000OTA升级小记
  6. solaris系统的crontab定时任务
  7. 关于动态库so的makefile编写
  8. 中班机器人歌曲_幼儿园机器人教案音乐
  9. 图解Kafka中的数据采集和统计机制
  10. Qt实现多语言切换 - Qt语言家