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

原文链接: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];
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

[图像]用Matlab在图像上画矩形框的更多相关文章

  1. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  2. matlab在图像中画长方形(框)

    function [state,result]=draw_rect(data,pointAll,windSize,showOrNot) % 函数调用:[state,result]=draw_rect( ...

  3. matlab 对图像操作的函数概览

    转自博客:http://blog.163.com/fei_lai_feng/blog/static/9289962200991713415422/ 一. 读写图像文件 1. imread imread ...

  4. C++调用Matlab引擎 图像读写与处理 (知识+代码篇)

    准备知识 之 Matlab Engine 执行命令 /* Execute matlab statement */ int engEvalString(Engine* ep, const char* s ...

  5. DAY13 Matlab实现图像错切源代码

    Matlab实现图像错切源代码 %错切im=(imread('robot.jpg'));im1=rgb2gray(im);figure,imshow(im1);[row,col]=size(im1); ...

  6. 非刚性图像配准 matlab简单示例 demons算法

    2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...

  7. 【matlab】图像直方图

    使用imhist函数(要先用rgb2gray转化为灰度图像) 利用matlab计算图像直方图函数为imhist() 具体用法: imhist( i );直接显示图像i的灰度直方图: imhist(i, ...

  8. MATLAB中图像的基本操作

    MATLAB中图像的基本操作 1.读取.显示图片 MATLAB中提供了immread()与imshow()函数读取和显示图片.其中读取函数imread()原型: imread: A = imread( ...

  9. matlab 提取图像轮廓(图像边缘提取)

    利用edge()函数提取图像轮廓,绘制出对象的边界和提取边界坐标信息,matlab实现代码如下: close all;clear all;clc; % 提取图像轮廓,提取图像边缘 I = imread ...

随机推荐

  1. 洛谷P1008三连击 题解

    题目传送门 使用dfs搜索,搜索9个数字,注意回溯...最后判断是否符合条件,输出. #include<bits/stdc++.h> using namespace std; ],a[]; ...

  2. hdu5984

    听说大佬都是看到1.693147就知道是ln(2)+1我是服气的 不过老老实实推的话就看你大一数分/高数是不是学扎实了 令 把L移到右边并两边求导可得,即 令 代入最开始的公式得到 化简可得,得解 # ...

  3. function(函数)中的动态参数

    我们可向函数传递动态参数,*args,**kwargs,首先我们来看*args,示例如下:     1.show(*args) def show(*args): print(args,type(arg ...

  4. Docker Zero Deployment and Secrets (一)

    在本节中,主要介绍在Docker swarm中如何不中断应用高可靠性的情况下更新服务和stack.这也叫做zero downtime deployment.还有就是swam如何管理密钥,保证容器之间的 ...

  5. 力扣:丑数II和数组中前K大的元素

    数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...

  6. aop相关术语

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面的编程.并不是全部的AOP框架都是一样的.他们连接点模型的功能可能有强弱之分,有些可以字段,方法,构 ...

  7. 【BZOJ 3998】 3998: [TJOI2015]弦论 (SAM )

    3998: [TJOI2015]弦论 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2627  Solved: 881 Description 对于一 ...

  8. PHP 笔记——String 字符串

    1. 定义 单引号括起来的字符串被原样输出. 双引号字符串中的变量被PHP解析为变量值. 2. 获取字符串长度 strlen(string $string): int 在utf-8下,汉字占3个字符, ...

  9. 「NOI2017」游戏

    「NOI2017」游戏 题目描述 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 \(A\).\(B\).\ ...

  10. BZOJ 2938 [Poi2000]病毒(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2938 [题目大意] 给出一些病毒串,问是否存在不包含任何病毒串的无限长的字符串 [题解 ...