原创文章,欢迎转载。转载请注明:转载自
原文链接:
在毕业设计的时候写论文画图,要在一个图像上精确的标记出要处理的区域,用Photoshop或是其他绘图软件难免不精确,而且也不符合懒人思维(以后怎么办,要一劳永逸,嘿嘿),所以就自己写软件吧。
编程思想和注意事项
其实程序的思路很简单,就是在局域外面像素的值(颜色)覆盖掉就行了,但是要注意几点内容。
- 原图像通道问题(边框颜色问题)。图像的是单通道的(黑白)还是多通道的(彩色),这点在于你要的框的颜色,我的方法是如果是单通道的图,现将其处理为多通道。
- 边界问题。边框是有宽度的,而且我的框是向外填充的,所以要考虑到图像的边界问题,如果超出去了就会报错(图像在Matlab中以数组的形式存在,超出范围了就越界了)
- 像素点位置。图像在Matlab中是以数组的形式存放的,在图像像素坐标系中,x方向用数组的列表示,y方向用数组的行表示。在取图像元素时候一定要注意。
绘制矩形框程序
保存为 drawRect.m
文件,这是一个函数文件。
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
。
边框样式2
无缺口的边框样式,在drawRect.m
文件中flag = 2
。
from: http://blog.csdn.net/humanking7/article/details/46819527