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

来源:互联网 发布:医学软件下载 编辑:程序博客网 时间:2024/06/04 23:38


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

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


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

编程思想和注意事项

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

  1. 原图像通道问题(边框颜色问题)。图像的是单通道的(黑白)还是多通道的(彩色),这点在于你要的框的颜色,我的方法是如果是单通道的图,现将其处理为多通道。
  2. 边界问题。边框是有宽度的,而且我的框是向外填充的,所以要考虑到图像的边界问题,如果超出去了就会报错(图像在Matlab中以数组的形式存在,超出范围了就越界了)
  3. 像素点位置。图像在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];endif nargin < 4    lineSize = 1;endif 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

调用主程序

调用drawRect.m 里的drawRect 函数。

clc;clear;close all;%-----------------------------------%给图像加一个矩形框%-----------------------------------[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'; '*.png' }, '选择图片');%没有图像if filename == 0    return;enddata = 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

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

1

边框样式2

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

2

0 0