• [图像]用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
  • 相关阅读:
    影响stm32仿真的因素
    DMA 如何查看它有没有传输完成 传输完成再开启
    keil出错总结
    一个例子讲解wav头文件 stm32声音程序 录音和播放 wav
    前期绑定 vs 后期绑定
    抽象类 VS 接口 (3)
    抽象类 VS 接口(1)
    封装之--JAVA中的访问修饰符(区别于.NET)
    【DP专题】——洛谷P1156垃圾陷阱
    MySql
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5598861.html
Copyright © 2020-2023  润新知