[图像]用Matlab在图像上画矩形框

news/2024/6/17 10:31:02 标签: matlab, photoshop

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:http://blog.csdn.net/humanking7/article/details/46819527


在毕业设计的时候写论文画图,要在一个图像上精确的标记出要处理的区域,用Photoshop或是其他绘图软件难免不精确,而且也不符合懒人思维(以后怎么办,要一劳永逸,嘿嘿),所以就自己写软件吧。

编程思想和注意事项

其实程序的思路很简单,就是在局域外面像素的值(颜色)覆盖掉就行了,但是要注意几点内容。

  1. 原图像通道问题(边框颜色问题)。图像的是单通道的(黑白)还是多通道的(彩色),这点在于你要的框的颜色,我的方法是如果是单通道的图,现将其处理为多通道。
  2. 边界问题。边框是有宽度的,而且我的框是向外填充的,所以要考虑到图像的边界问题,如果超出去了就会报错(图像在Matlab中以数组的形式存在,超出范围了就越界了)
  3. 像素点位置。图像在Matlab中是以数组的形式存放的,在图像像素坐标系中,x方向用数组的列表示,y方向用数组的行表示。在取图像元素时候一定要注意。

绘制矩形框程序

保存为 drawRect.m 文件,这是一个函数文件。

matlab has-numbering">function [ dest ] = drawRect( src, pt, wSize, lineSize, color ) %简介: % %将图像画上有颜色的框图,如果输入是灰度图,先转换为彩色图像,再画框图 % 图像矩阵 % 行向量方向 是 y % 列向量方向 是 x %---------------------------------------------------------------------- %输入: % src: 原始图像,可以为灰度图,可为彩色图 % pt: 左上角坐标 [x1, y1] % wSize: 框的大小 [wx, wy] % lineSize: 线的宽度 % color: 线的颜色 [r, g, b] %---------------------------------------------------------------------- %输出: % dest: 画好了的图像 %---------------------------------------------------------------------- %flag=1: 有缺口的框 %flag=2: 无缺口的框 flag = 1; %判断输入参数个数 if nargin < 5 color = [255 255 0]; end if nargin < 4 lineSize = 1; end if nargin < 3 disp('输入参数不够 !!!'); return; end %判断框的边界问题 [yA, xA, z] = size(src); x1 = pt(1); y1 = pt(2); wx = wSize(1); wy = wSize(2); if x1>xA || ... y1>yA||... (x1+wx)>xA||... (y1+wy)>yA disp('画的框将超过图像 !!!'); return; end %如果是单通道的灰度图,转成3通道的图像 if 1==z dest(:, : ,1) = src; dest(:, : ,2) = src; dest(:, : ,3) = src; else dest = src; end %开始画框图 for c = 1 : 3 %3个通道,r,g,b分别画 for dl = 1 : lineSize %线的宽度,线条是向外面扩展的 d = dl - 1; if 1==flag %有缺口的框 dest( y1-d , x1:(x1+wx) , c ) = color(c); %上方线条 dest( y1+wy+d , x1:(x1+wx) , c ) = color(c); %下方线条 dest( y1:(y1+wy) , x1-d , c ) = color(c); %左方线条 dest( y1:(y1+wy) , x1+wx+d , c ) = color(c); %左方线条 elseif 2==flag %无缺口的框 dest( y1-d , (x1-d):(x1+wx+d) , c ) = color(c); %上方线条 dest( y1+wy+d , (x1-d):(x1+wx+d) , c ) = color(c); %下方线条 dest( (y1-d):(y1+wy+d) , x1-d , c ) = color(c); %左方线条 dest( (y1-d):(y1+wy+d) , x1+wx+d , c ) = color(c); %左方线条 end end end %主循环尾 end %函数尾 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

调用主程序

调用drawRect.m 里的drawRect 函数。

clc;
clear;
close all;
%-----------------------------------
%给图像加一个矩形框
%-----------------------------------

[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片'); %没有图像 if filename == 0 return; end data = imread([pathname, filename]); [m, n, z] = size(data); pt = [185, 273]; wSize = [60,60]; des = drawRect(data,pt,wSize,5 ); subplot(1,2,1) imshow(data) subplot(1,2,2) imshow(des) return;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

处理结果

边框样式1

有缺口的边框样式,在drawRect.m 文件中flag = 1 。

1

边框样式2

无缺口的边框样式,在drawRect.m 文件中flag = 2 。

2

 
 from: http://blog.csdn.net/humanking7/article/details/46819527

http://www.niftyadmin.cn/n/977313.html

相关文章

动态规划(DP) 简单总结

DP&#xff08;动态规划&#xff09;&#xff1a; 概念&#xff1a; 用来解决一类最优化问题的算法思想&#xff0c;即 将一个复杂的问题分解成若干个子问题&#xff0c;通过综合子问题的最优解得到原问题的最优解&#xff0c;DP会将每个求解过程的自问题的解记录下来&#xf…

今天看到了一篇文档 app 测试内容记录下来

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.3测试资源 测…

使用JSP表达式和JSP脚本打印九九乘法表

首先使用JSP声明声明一个函数用于得到九九乘法表的内容 <%!String printMultiTable() {String s "";for (int i 1; i < 10; i ) {for (int j 1; j < i; j ) s " " i " * " j " " (i * j) " ";s "…

linux下GPRS模块使用AT命令实现拨接电话,发中英文短信

开发板 &#xff1a;fl2440 cpu : s3c2440(arm9) 开发模块 &#xff1a;A7(GPRS/GPS) 远程登陆软件&#xff1a;PUTTY ******************************************************************************************************************…

BASIC-25 VIP试题 回形取数

问题描述   回形取数就是沿矩阵的边取数&#xff0c;若当前方向上无数可取或已经取过&#xff0c;则左转90度。一开始位于矩阵左上角&#xff0c;方向向下。 输入格式   输入第一行是两个不超过200的正整数m, n&#xff0c;表示矩阵的行和列。接下来m行每行n个整数&#xf…

QT笔记之QLineEdit自动补全以及控件提升

转载&#xff1a;http://www.cnblogs.com/csuftzzk/p/qss_lineedit_completer.html?utm_sourcetuicool&utm_mediumreferral 转载&#xff1a;http://blog.csdn.net/starcloud_zxt/article/details/5186489 转载&#xff1a;http://blog.sina.com.cn/s/blog_a6fb6cc90101gu…

微信小程序初探【类微信UI聊天简单实现】

微信小程序最近很火&#xff0c;火到什么程度&#xff0c;只要你一打开微信&#xff0c;就是它的身影&#xff0c;几乎你用的各个APP都可以在微信中找到它的复制版&#xff0c;另外官方自带的跳一跳更是将它推到了空前至高的位置。对比公众号&#xff0c;就我的感觉来说&#x…

BASIC-24 VIP试题 龟兔赛跑预测

问题描述   话说这个世界上有各种各样的兔子和乌龟&#xff0c;但是研究发现&#xff0c;所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛&#xff0c;小华对此很感兴趣&#xff0c;于是决定研究不同兔子和乌龟的赛跑。他…