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

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

在毕业设计的时候写论文画图,要在一个图像上精确的标记出要处理的区域,用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 。

434103beb91174b4c0b2691093dd968c.png

边框样式2

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

acb5cdbd14178650bbe1998c8eaf9b3d.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值