[圖像]用Matlab在圖像上畫矩形框


原創文章,歡迎轉載。轉載請注明:轉載自 祥的博客

原文鏈接: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 。

1

邊框樣式2

無缺口的邊框樣式,在drawRect.m 文件中flag = 2 。

2

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM