精华内容
下载资源
问答
  • 本示例通过将不同的变换应用于棋盘图像来显示几何变换的许多属性。概览二维几何变换是将欧几里得平面中的每个点与欧几里得平面中的另一个点相关联的映射。在这些示例中,几何变换由一条规则定义,该规则告诉如何将...

    0208403fb2f1fc3ba60e5830453d954b.png

    本示例通过将不同的变换应用于棋盘图像来显示几何变换的许多属性。

    概览

    二维几何变换是将欧几里得平面中的每个点与欧几里得平面中的另一个点相关联的映射。在这些示例中,几何变换由一条规则定义,该规则告诉如何将具有笛卡尔坐标(x,y)的点映射到具有笛卡尔坐标(u,v)的另一个点。棋盘图案有助于可视化输入图像平面中的坐标网格以及每次转换所引入的失真类型。

    图1:创建棋盘格

    checkerboard 生成的图像具有矩形图块和四个唯一的角,这使您很容易看到棋盘格图像如何因几何变换而失真。

    运行完此示例一次后,请尝试将图像I更改为您喜欢的图像。

     sqsize = 60;
     I = checkerboard(sqsize,4,4);
     nrows = size(I,1);
     ncols = size(I,2);
     fill = 0.3;imshow(I)
     title('Original')

    5753c368abd74930905059b3483e0b37.png

    图2:将非反射相似性应用于棋盘格

    非反射相似性变换可以包括旋转,缩放和平移。这些变换保留了形状和角度。平行线保持平行。直线保持直线。

    对于非反射相似性,

    [u v]=[x y 1]T

    T 是一个3×3矩阵,取决于4个参数。

     % Try varying these 4 parameters.
     scale = 1.2;       % scale factor
     angle = 40*pi/180; % rotation angle
     tx = 0;            % x translation
     ty = 0;            % y translationsc = scale*cos(angle);
     ss = scale*sin(angle);T = [ sc -ss  0;
           ss  sc  0;
           tx  ty  1];

    由于非反射相似性是仿射变换的子集,因此可以使用以下方法创建affine2d对象:

     t_nonsim = affine2d(T);
     I_nonreflective_similarity = imwarp(I,t_nonsim,'FillValues',fill);imshow(I_nonreflective_similarity);
     title('Nonreflective Similarity')

    aaf7c195a0c5aa181010ae381714654c.png

    如果您更改txty为非零值,你会发现,它对输出图像没有影响。如果要查看与转换对应的坐标(包括平移),请包含空间参考信息:

     [I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',fill);imshow(I_nonreflective_similarity,RI)
     axis on
     title('Nonreflective Similarity (Spatially Referenced)')

    ee6837b7039ddcc8b138de4bdc99e4dc.png

    注意,从imwarp中传递输出空间参考对象RI揭示了平移。要指定要查看输出图像的哪一部分,请在imwarp函数中使用“ OutputView”名称/值对。

    图3:将相似性应用于棋盘格

    在相似性转换中,相似的三角形映射到相似的三角形。非反射相似变换是相似变换的子集。

    对于相似性,该方程式与非反射相似性相同:

    [u v]=[x y 1]T

    T 是一个3×3矩阵,它取决于4个参数以及一个可选的反射。

     % Try varying these parameters.
     scale = 1.5;        % scale factor
     angle = 10*pi/180; % rotation angle
     tx = 0;            % x translation
     ty = 0;            % y translation
     a = -1;            % -1 -> reflection, 1 -> no reflectionsc = scale*cos(angle);
     ss = scale*sin(angle);T = [   sc   -ss  0;
           a*ss  a*sc  0;
             tx    ty  1];

    由于相似性是仿射变换的子集,因此可以使用以下方法创建affine2d对象:

     t_sim = affine2d(T);

    与上面的平移示例一样,从imwarp函数中检索输出的空间参考对象RI,并将RI传递到imshow以显示反射。

     [I_similarity,RI] = imwarp(I,t_sim,'FillValues',fill);imshow(I_similarity,RI)
     axis on
     title('Similarity')

    e15c9b3370c2e7d78bd8d0f35d5e95b5.png

    图4:将仿射变换应用于棋盘格

    在仿射变换中,x和y维度可以独立缩放或剪切,并且可以存在平移、反射和/或旋转。平行线保持平行。直线保持直线。相似性是仿射变换的子集。

    对于仿射变换,等式与相似性和非反射相似性相同:

    [u v]=[x y 1]T

    T是3 x 3矩阵,其中第一列和第二列的所有六个元素都可以不同。第三列必须为[0; 0; 1]。

     % Try varying the definition of T.
     T = [1  0.3  0; 
          1    1  0;
          0    0  1];
     t_aff = affine2d(T);
     I_affine = imwarp(I,t_aff,'FillValues',fill);imshow(I_affine)
     title('Affine')

    e0db930a315c22480c482c9aec88c565.png

    图5:将投影变换应用于棋盘格

    在投影变换中,四边形映射到四边形。直线保持直线,但平行线不一定保持平行。仿射变换是投影变换的子集。

    对于投影变换:

    [up vp wp]=[x y w]T

    u=up/wp

    v=vp/wp

    T是一个3×3矩阵,其中所有9个元素都可以不同。

    T= [A D G

    B E H

    C F I]

    上面的矩阵方程式等效于以下两个表达式:

    u=(Ax+By+C)/(Gx+Hy+I)

    v=(Dx+Ey+F)/(Gx+Hy+I)

    尝试更改T中九个元素中的任何一个。

     T = [1  0  0.002; 
          1  1  0.0002;
          0  0  1   ];
     t_proj = projective2d(T);I_projective = imwarp(I,t_proj,'FillValues',fill);
     imshow(I_projective)
     title('Projective')

    68be1c0232d836133e36040c069ff9e0.png

    图6:对棋盘格应用分段线性变换

    在分段线性变换中,仿射变换分别应用于图像区域。在此示例中,棋盘的左上角,右上角和左下角点保持不变,但是图像右下角的三角形区域被拉伸,因此变换后的图像的右下角为向右50%,比原始坐标低20%。

     movingPoints = [0 0; 0 nrows; ncols 0; ncols nrows;]; 
     fixedPoints  = [0 0; 0 nrows; ncols 0; ncols*1.5 nrows*1.2]; 
     t_piecewise_linear = fitgeotrans(movingPoints,fixedPoints,'pwl');I_piecewise_linear = imwarp(I,t_piecewise_linear,'FillValues',fill);
     imshow(I_piecewise_linear)
     title('Piecewise Linear')

    f766179651a0c9dcfa3fe10871ae48c3.png

    图7:将正弦变换应用于棋盘

    本示例和以下两个示例显示了如何创建显式映射,以将常规网格(xi,yi)中的每个点与另一个点(ui,vi)关联。此映射存储在一个geometricTranform2d对象中,imwarp使用该对象用于变换图像。

    在此正弦变换中,每个像素的x坐标不变。每行像素的y坐标按照正弦曲线模式上移或下移。

     a = ncols/12; % Try varying the amplitude of the sinusoid
     ifcn = @(xy) [xy(:,1), xy(:,2) + a*sin(2*pi*xy(:,1)/nrows)];
     tform = geometricTransform2d(ifcn);I_sinusoid = imwarp(I,tform,'FillValues',fill);
     imshow(I_sinusoid);
     title('Sinusoid')

    c7164b7f9bcc3abd0f8f849f16440909.png

    图8:将桶形转换应用于棋盘格

    桶形失真会使图像从其中心径向向外扩散传播。离中心越远,失真越大,从而导致产生凸面。

    首先,定义一个函数,将像素索引映射为到中心的距。使用meshgrid函数创建每个像素的x坐标和y坐标的数组,其原点位于图像的左上角。

     [xi,yi] = meshgrid(1:ncols,1:nrows);

    将原点移动到图像的中心。然后,使用函数cart2pol将笛卡尔的x和y坐标转换为圆柱角(theta)和半径(r)坐标。随着到中心像素的距离增加,r也线性变化。

     xt = xi - ncols/2;
     yt = yi - nrows/2;
     [theta,r] = cart2pol(xt,yt);

    定义三次项的幅度a。此参数是可调的。然后,向r中添加一个三次项,以便r随着距中心像素的距离呈现非线性变化。

     a = 1; % Try varying the amplitude of the cubic term.
     rmax = max(r(:));
     s1 = r + r.^3*(a/rmax.^2);

    转换回笛卡尔坐标系。将原点移回图像的右上角。

     [ut,vt] = pol2cart(theta,s1);
     ui = ut + ncols/2;
     vi = vt + nrows/2;

    在对象geometricTranform2d中,存储(xiyi)和(uivi)之间的映射。根据像素映射,用imwarp变换图像。

     ifcn = @(c) [ui(:) vi(:)];
     tform = geometricTransform2d(ifcn);I_barrel = imwarp(I,tform,'FillValues',fill);
     imshow(I_barrel)
     title('Barrel')

    ea83d95ea4d48ae9021dfdc09a64dc0b.png

    图9:将枕形转换应用于棋盘格

    枕形失真是桶形失真的逆,因为三次项的振幅为负。距中心越远,变形仍然更大,但变形显示为凹面。

    你可以从与桶形变换相同的thetar值开始。定义三次项的另一个幅度b。此参数是可调的。然后,用r减去三次项,以使r距中心像素的距离呈非线性变化。

     b = 0.4; % Try varying the amplitude of the cubic term.
     s = r - r.^3*(b/rmax.^2);

    转换回笛卡尔坐标系。将原点移回图像的右上角。

     [ut,vt] = pol2cart(theta,s);
     ui = ut + ncols/2;
     vi = vt + nrows/2;

    存储geometricTranform2d对象中(xiyi)和(uivi)之间的映射。根据像素映射,用imwarp变换图像。

     ifcn = @(c) [ui(:) vi(:)];
     tform = geometricTransform2d(ifcn);
     I_pin = imwarp(I,tform,'FillValues',fill);
     imshow(I_pin)
     title('Pin Cushion')

    5965b809ad938b99ee7af76bf4c71623.png

    摘要:显示棋盘格的所有几何变换

     figure
     subplot(3,3,1),imshow(I),title('Original')
     subplot(3,3,2),imshow(I_nonreflective_similarity),title('Nonreflective Similarity')
     subplot(3,3,3),imshow(I_similarity),title('Similarity')
     subplot(3,3,4),imshow(I_affine),title('Affine')
     subplot(3,3,5),imshow(I_projective),title('Projective')
     subplot(3,3,6),imshow(I_piecewise_linear),title('Piecewise Linear')
     subplot(3,3,7),imshow(I_sinusoid),title('Sinusoid')
     subplot(3,3,8),imshow(I_barrel),title('Barrel')
     subplot(3,3,9),imshow(I_pin),title('Pin Cushion')

    a29b4bb17cdc6450a5997a8e7ea5c1d3.png

    请注意,subplot会更改正在显示图像的比例。


    注:本文根据MATLAB官网内容修改而成。

    欢迎您进一步了解以下MATLAB系列文章:

    吃小羊:MATLAB作图实例:00:索引zhuanlan.zhihu.com
    b316909f2c82f40163fc613d23e5910b.png
    吃小羊:MATLAB金融工具箱:00:索引zhuanlan.zhihu.com
    0f8603d8305f382337ddeb33c4c66a7b.png
    展开全文
  • 学习一门技术最好的方式就是阅读官方文档,可以查看MATLAB官方文档图像的读取和展示图像MATLAB中的存储格式MATLAB能够处理的数字图像分为三种:二值图像,灰度图像,彩色图像. 二值图像MATLAB中以一个矩阵存储,矩阵...

    学习一门技术最好的方式就是阅读官方文档,可以查看MATLAB官方文档

    图像的读取和展示

    图像在MATLAB中的存储格式

    MATLAB能够处理的数字图像分为三种:二值图像,灰度图像,彩色图像.

    a4f2d5cb41a16425b1ec9c9626dbd97d.png

    二值图像在MATLAB中以一个矩阵存储,矩阵中元素的取值为0(表示白)或1(表示黑).

    fa90a172c7008444965ed0d082184ac0.png

    灰度图像在MATLAB中以一个矩阵存储,矩阵中元素的取值介于0~255之间,表示灰度.

    c362bbf141419bddf08fc078057653eb.png

    彩色图像在MATLAB中以三个矩阵存储,每个矩阵中元素的取值介于0~255之间,分别表示颜色R,G,B分量的浓度

    24386290895052bf1bbceed10d59ebaa.png

    读取和展示图像

    使用imread()函数将图像读取到内存中,使用imshow()函数展示图像,使用imwrite()函数将内存中的图像写进硬盘.

    clear, close all

    I = imread('pout.tif'); % 将MATLAB自带图像'pout.tif'读取到内存中

    imshow(I); % 在图形窗口展示该图像

    imwrite(I,'myimage.png');% 将该图像存为png格式的文件

    2b7078f4b89f48c5370bf2cd15cc5d63.png

    使用imageinfo()函数查看图片文件的详细信息.

    imageinfo('pout.tif')

    3dbb7e6e9b3dd998509f3d8a82cf0f87.png

    使用imtool()函数可以打开图像处理工具.

    imtool('pout.tif')

    c07b2fd1e77d21775113fb8be8ba2aac.png

    图像的运算

    图像的点运算

    图像在内存中以矩阵的形式存储,因此我们可以像遍历矩阵那样遍历并编辑图片上的像素点.MATLAB也内置了一些函数用于进行图像运算.

    图像的四则运算

    要对两个图像进行四则运算,要求这两个图像的尺寸相同.下面是常用的图像四则运算函数,具体细节请参考官方文档.

    函数作用imabsdiff()两个图像求差值

    imadd()一个图像加上另一个图像或常数

    imsubtract()一个图像减去另一个图像或常数

    immultiply()一个图像乘以另一个图像或常数

    imdivide()一个图像除以另一个图像或常数

    imcomplement()对图像取反

    I=imread('rice.png');

    subplot(1,2,1); imshow(I);

    J=immultiply(I, 1.5);

    subplot(1,2,2); imshow(J);

    695a65fe4f4ba587b010f0ecda40919f.png

    I=imread('rice.png'); J=imread('cameraman.tif');

    K=imadd(I,J);

    subplot(1,3,1); imshow(I);

    subplot(1,3,2); imshow(K);

    subplot(1,3,3); imshow(J);

    650a7af6662fbf1955445b76945bc584.png

    可以看到,进行加法操作后,得到的图像比原本的两个都亮,这是因为图像矩阵的数值整体上增加了.

    像素的统计分布

    使用imhist()函数可以分析像素值的统计分布.

    I = imread('pout.tif');

    imhist(I)

    5e46f3de9f3c6cef039a3278129a3b7b.png

    使用histeq()可以增大图像的对比度,这本质上做了直方图的均衡化(Histogram Equalization)操作.

    I = imread('pout.tif'); I2 = histeq(I);

    subplot(1,4,1); imhist(I);

    subplot(1,4,2); imshow(I);

    subplot(1,4,3); imshow(I2);

    subplot(1,4,4); imhist(I2);

    f81e04992a1080e942051b3b9f0037fc.png

    图像的二值化

    将灰度图像变为二值图像的过程被称为二值化,MATLAB内置了两个与二值化相关的函数.

    graythresh()函数用于计算二值化变换过程中的最优阈值(threshold).灰度图像上超过该阈值的点将被赋值为1,低于该阈值的点将被赋值为0.

    im2bw()用于进行二值化变换.

    I = imread('rice.png');

    level=graythresh(I); bw=im2bw(I, level);

    subplot(1,2,1); imshow(I);

    subplot (1,2,2); imshow(bw)

    2f01e472f2b22b6ee0d2bed1d5e15c52.png

    图像的几何变换

    图像的几何变换本质上就是将图像乘以一个矩阵得到新图像的过程.

    变换形式图形示意数学变换MATLA命令位移(Translation)982b3fa469a4cd6121712c0ad1a98e6e.png[

    x

    y

    1

    ]

    =

    [

    1

    0

    t

    x

    0

    1

    t

    y

    0

    0

    1

    ]

    [

    x

    y

    1

    ]

    \left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right]⎣⎡​x′y′1​⎦⎤​=⎣⎡​100​010​tx​ty​1​⎦⎤​∗⎣⎡​xy1​⎦⎤​imtranslate()

    缩放(Scale)6bb2a5d3b301b80a29652b1825794867.png[

    x

    y

    1

    ]

    =

    [

    s

    x

    0

    0

    0

    s

    y

    0

    0

    0

    1

    ]

    [

    x

    y

    1

    ]

    \left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right]⎣⎡​x′y′1​⎦⎤​=⎣⎡​sx​00​0sy​0​001​⎦⎤​∗⎣⎡​xy1​⎦⎤​imresize()

    错切(Shear)b4e980f4af77ad792fad1f76825421ac.png[

    x

    y

    1

    ]

    =

    [

    1

    h

    x

    0

    h

    y

    1

    0

    0

    0

    1

    ]

    [

    x

    y

    1

    ]

    \left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} 1 & h_x & 0 \\ h_y & 1 & 0 \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right]⎣⎡​x′y′1​⎦⎤​=⎣⎡​1hy​0​hx​10​001​⎦⎤​∗⎣⎡​xy1​⎦⎤​

    旋转(Rotate)eb89d74dd3ae1d719b6e56e29a4814c5.png[

    x

    y

    1

    ]

    =

    [

    cos

    θ

    sin

    θ

    0

    sin

    θ

    cos

    θ

    0

    0

    0

    1

    ]

    [

    x

    y

    1

    ]

    \left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} \cos\theta & \sin\theta & 0 \\ -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right]⎣⎡​x′y′1​⎦⎤​=⎣⎡​cosθ−sinθ0​sinθcosθ0​001​⎦⎤​∗⎣⎡​xy1​⎦⎤​imrotate()

    I = imread('rice.png'); J = imrotate(I, 35, 'bilinear');

    subplot(1,2,1);imshow(I);

    subplot(1,2,2); imshow(J);

    size(I)% 得到 [256, 256]

    size(J)% 得到 [357, 357]

    1e76285a089202f37f221a9f17c79461.png

    可以看到,进行旋转变换后,图像的尺寸增加了.

    使用MATLAB分析图像:目标计数

    我们想要通过MATLAB分析rice.png图片中米粒的个数.

    43637f449a881ac69313ff72eb0cf30b.png

    图像预处理

    要分析图像中的米粒个数,我们需要对图像进行两步预处理:

    去除图像的背景: I = imread('rice.png');

    subplot(1,3,1); imshow(I);

    BG = imopen(I, strel('disk', 15));

    subplot(1,3,2); imshow(BG);

    I2 = imsubtract(I, BG);

    subplot(1,3,3); imshow(I2);

    bdcc0f2744c22b1c4ae41439654bdc2e.png

    对图像进行二值化: I2 = imsubtract(I, BG); level=graythresh(I2);

    bw2 = im2bw(I2, level);

    下面代码展示了是否去除背景对图像二值化结果的影响:

    % 直接对图像进行二值化

    I = imread('rice.png');

    level=graythresh(I); bw = im2bw(I, level);

    subplot (1,2,1); imshow(bw); title('直接进行二值化');

    % 去除背景后对图像进行二值化

    BG = imopen(I, strel('disk', 15)); I2 = imsubtract(I, BG);

    level=graythresh(I2); bw2 = im2bw(I2, level);

    subplot(1,2,2); imshow(bw2); title('去除背景后进行二值化');

    0fc4927b8ccafc1e6bc4696b5dd23254.png

    目标计数:标记连通区域

    识别米粒个数的关键在于识别连通区域.

    7318a41152beb3669e4169c683f4145f.png

    在这里,我们使用MATLAB自带的bwlabel()函数计算连通区域,该函数使用了连通区域标记算法,将每个连通区域内的像素点赋值为同一个值.

    7997959e5193de01dbee000480f17678.png

    I=imread('rice.png');

    BG=imopen(I, strel('disk', 15));

    I2=imsubtract(I, BG); level=graythresh(I2);

    BW=im2bw(I2, level);

    [labeled, numObjects]=bwlabel(BW, 8);

    得到labeled为标记好的矩阵,其尺寸与原图片相同,每个连通区域都被赋值为一个相同的整数,其他区域被赋值为0.numObjects为计算出的连通区域个数,为99.

    使用label2rgb()函数可以将标记结果以彩色图片的形式展示

    RGB_label=label2rgb(labeled);

    imshow(RGB_label);

    6f759a8c74f5d94769a67a841cb67b70.png

    分析检测结果

    使用regionprops()函数可以将检测结果封装成结构体数组.

    graindata = regionprops(labeled, 'basic');

    graindata(51)

    Area: 155

    Centroid: [112.4258 245.8645]

    BoundingBox: [108.5000 234.5000 8 22]

    使用bwselect()函数可以交互式选择连通区域

    ObjI = bwselect(BW);

    imshow(ObjI);

    a6887ba285a51500553ccc15ca022a9c.png

    展开全文
  • matImage:Matlab图像处理库
  • 本示例通过将不同的变换应用于棋盘图像来显示几何变换的许多属性。概览二维几何变换是将欧几里得平面中的每个点与欧几里得平面中的另一个点相关联的映射。在这些示例中,几何变换由一条规则定义,该规则告诉如何将...

    0fcc6a7cdb86191a835df93cf45a2592.png

    本示例通过将不同的变换应用于棋盘图像来显示几何变换的许多属性。

    概览

    二维几何变换是将欧几里得平面中的每个点与欧几里得平面中的另一个点相关联的映射。在这些示例中,几何变换由一条规则定义,该规则告诉如何将具有笛卡尔坐标(x,y)的点映射到具有笛卡尔坐标(u,v)的另一个点。棋盘图案有助于可视化输入图像平面中的坐标网格以及每次转换所引入的失真类型。

    图1:创建棋盘格

    checkerboard 生成的图像具有矩形图块和四个唯一的角,这使您很容易看到棋盘格图像如何因几何变换而失真。

    运行完此示例一次后,请尝试将图像I更改为您喜欢的图像。

     sqsize = 60;
     I = checkerboard(sqsize,4,4);
     nrows = size(I,1);
     ncols = size(I,2);
     fill = 0.3;imshow(I)
     title('Original')

    79f440e1496bf21e1520250a6ce44d4d.png

    图2:将非反射相似性应用于棋盘格

    非反射相似性变换可以包括旋转,缩放和平移。这些变换保留了形状和角度。平行线保持平行。直线保持直线。

    对于非反射相似性,

    [u v]=[x y 1]T

    T 是一个3×3矩阵,取决于4个参数。

     % Try varying these 4 parameters.
     scale = 1.2;       % scale factor
     angle = 40*pi/180; % rotation angle
     tx = 0;            % x translation
     ty = 0;            % y translationsc = scale*cos(angle);
     ss = scale*sin(angle);T = [ sc -ss  0;
           ss  sc  0;
           tx  ty  1];

    由于非反射相似性是仿射变换的子集,因此可以使用以下方法创建affine2d对象:

     t_nonsim = affine2d(T);
     I_nonreflective_similarity = imwarp(I,t_nonsim,'FillValues',fill);imshow(I_nonreflective_similarity);
     title('Nonreflective Similarity')

    6d5f42ac0cfe83fee2d0a9f5e2bef6bf.png

    如果您更改txty为非零值,你会发现,它对输出图像没有影响。如果要查看与转换对应的坐标(包括平移),请包含空间参考信息:

     [I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',fill);imshow(I_nonreflective_similarity,RI)
     axis on
     title('Nonreflective Similarity (Spatially Referenced)')

    e642e16592fdc6df32c9e1c791baa478.png

    注意,从imwarp中传递输出空间参考对象RI揭示了平移。要指定要查看输出图像的哪一部分,请在imwarp函数中使用“ OutputView”名称/值对。

    图3:将相似性应用于棋盘格

    在相似性转换中,相似的三角形映射到相似的三角形。非反射相似变换是相似变换的子集。

    对于相似性,该方程式与非反射相似性相同:

    [u v]=[x y 1]T

    T 是一个3×3矩阵,它取决于4个参数以及一个可选的反射。

     % Try varying these parameters.
     scale = 1.5;        % scale factor
     angle = 10*pi/180; % rotation angle
     tx = 0;            % x translation
     ty = 0;            % y translation
     a = -1;            % -1 -> reflection, 1 -> no reflectionsc = scale*cos(angle);
     ss = scale*sin(angle);T = [   sc   -ss  0;
           a*ss  a*sc  0;
             tx    ty  1];

    由于相似性是仿射变换的子集,因此可以使用以下方法创建affine2d对象:

     t_sim = affine2d(T);

    与上面的平移示例一样,从imwarp函数中检索输出的空间参考对象RI,并将RI传递到imshow以显示反射。

     [I_similarity,RI] = imwarp(I,t_sim,'FillValues',fill);imshow(I_similarity,RI)
     axis on
     title('Similarity')

    f4c027b1d5a273f6c2c7ebd5e7b8e902.png

    图4:将仿射变换应用于棋盘格

    在仿射变换中,x和y维度可以独立缩放或剪切,并且可以存在平移、反射和/或旋转。平行线保持平行。直线保持直线。相似性是仿射变换的子集。

    对于仿射变换,等式与相似性和非反射相似性相同:

    [u v]=[x y 1]T

    T是3 x 3矩阵,其中第一列和第二列的所有六个元素都可以不同。第三列必须为[0; 0; 1]。

     % Try varying the definition of T.
     T = [1  0.3  0; 
          1    1  0;
          0    0  1];
     t_aff = affine2d(T);
     I_affine = imwarp(I,t_aff,'FillValues',fill);imshow(I_affine)
     title('Affine')

    0b5d8239e078bfe6c025c8a758d55ec7.png

    图5:将投影变换应用于棋盘格

    在投影变换中,四边形映射到四边形。直线保持直线,但平行线不一定保持平行。仿射变换是投影变换的子集。

    对于投影变换:

    [up vp wp]=[x y w]T

    u=up/wp

    v=vp/wp

    T是一个3×3矩阵,其中所有9个元素都可以不同。

    T= [A D G

    B E H

    C F I]

    上面的矩阵方程式等效于以下两个表达式:

    u=(Ax+By+C)/(Gx+Hy+I)

    v=(Dx+Ey+F)/(Gx+Hy+I)

    尝试更改T中九个元素中的任何一个。

     T = [1  0  0.002; 
          1  1  0.0002;
          0  0  1   ];
     t_proj = projective2d(T);I_projective = imwarp(I,t_proj,'FillValues',fill);
     imshow(I_projective)
     title('Projective')

    fb4481a80f2f4333c9a67aaa71fe0a43.png

    图6:对棋盘格应用分段线性变换

    在分段线性变换中,仿射变换分别应用于图像区域。在此示例中,棋盘的左上角,右上角和左下角点保持不变,但是图像右下角的三角形区域被拉伸,因此变换后的图像的右下角为向右50%,比原始坐标低20%。

     movingPoints = [0 0; 0 nrows; ncols 0; ncols nrows;]; 
     fixedPoints  = [0 0; 0 nrows; ncols 0; ncols*1.5 nrows*1.2]; 
     t_piecewise_linear = fitgeotrans(movingPoints,fixedPoints,'pwl');I_piecewise_linear = imwarp(I,t_piecewise_linear,'FillValues',fill);
     imshow(I_piecewise_linear)
     title('Piecewise Linear')

    2098a5d2c1440b573f75a0eb591c16b5.png

    图7:将正弦变换应用于棋盘

    本示例和以下两个示例显示了如何创建显式映射,以将常规网格(xi,yi)中的每个点与另一个点(ui,vi)关联。此映射存储在一个geometricTranform2d对象中,imwarp使用该对象用于变换图像。

    在此正弦变换中,每个像素的x坐标不变。每行像素的y坐标按照正弦曲线模式上移或下移。

     a = ncols/12; % Try varying the amplitude of the sinusoid
     ifcn = @(xy) [xy(:,1), xy(:,2) + a*sin(2*pi*xy(:,1)/nrows)];
     tform = geometricTransform2d(ifcn);I_sinusoid = imwarp(I,tform,'FillValues',fill);
     imshow(I_sinusoid);
     title('Sinusoid')

    7653ddc846577d5a3adcb3fc0dad466c.png

    图8:将桶形转换应用于棋盘格

    桶形失真会使图像从其中心径向向外扩散传播。离中心越远,失真越大,从而导致产生凸面。

    首先,定义一个函数,将像素索引映射为到中心的距。使用meshgrid函数创建每个像素的x坐标和y坐标的数组,其原点位于图像的左上角。

     [xi,yi] = meshgrid(1:ncols,1:nrows);

    将原点移动到图像的中心。然后,使用函数cart2pol将笛卡尔的x和y坐标转换为圆柱角(theta)和半径(r)坐标。随着到中心像素的距离增加,r也线性变化。

     xt = xi - ncols/2;
     yt = yi - nrows/2;
     [theta,r] = cart2pol(xt,yt);

    定义三次项的幅度a。此参数是可调的。然后,向r中添加一个三次项,以便r随着距中心像素的距离呈现非线性变化。

     a = 1; % Try varying the amplitude of the cubic term.
     rmax = max(r(:));
     s1 = r + r.^3*(a/rmax.^2);

    转换回笛卡尔坐标系。将原点移回图像的右上角。

     [ut,vt] = pol2cart(theta,s1);
     ui = ut + ncols/2;
     vi = vt + nrows/2;

    在对象geometricTranform2d中,存储(xiyi)和(uivi)之间的映射。根据像素映射,用imwarp变换图像。

     ifcn = @(c) [ui(:) vi(:)];
     tform = geometricTransform2d(ifcn);I_barrel = imwarp(I,tform,'FillValues',fill);
     imshow(I_barrel)
     title('Barrel')

    8debe89dd8274fd0f26d8d2d15704b16.png

    图9:将枕形转换应用于棋盘格

    枕形失真是桶形失真的逆,因为三次项的振幅为负。距中心越远,变形仍然更大,但变形显示为凹面。

    你可以从与桶形变换相同的thetar值开始。定义三次项的另一个幅度b。此参数是可调的。然后,用r减去三次项,以使r距中心像素的距离呈非线性变化。

     b = 0.4; % Try varying the amplitude of the cubic term.
     s = r - r.^3*(b/rmax.^2);

    转换回笛卡尔坐标系。将原点移回图像的右上角。

     [ut,vt] = pol2cart(theta,s);
     ui = ut + ncols/2;
     vi = vt + nrows/2;

    存储geometricTranform2d对象中(xiyi)和(uivi)之间的映射。根据像素映射,用imwarp变换图像。

     ifcn = @(c) [ui(:) vi(:)];
     tform = geometricTransform2d(ifcn);
     I_pin = imwarp(I,tform,'FillValues',fill);
     imshow(I_pin)
     title('Pin Cushion')

    6f8636ab8ea01097f738654f2022950f.png

    摘要:显示棋盘格的所有几何变换

     figure
     subplot(3,3,1),imshow(I),title('Original')
     subplot(3,3,2),imshow(I_nonreflective_similarity),title('Nonreflective Similarity')
     subplot(3,3,3),imshow(I_similarity),title('Similarity')
     subplot(3,3,4),imshow(I_affine),title('Affine')
     subplot(3,3,5),imshow(I_projective),title('Projective')
     subplot(3,3,6),imshow(I_piecewise_linear),title('Piecewise Linear')
     subplot(3,3,7),imshow(I_sinusoid),title('Sinusoid')
     subplot(3,3,8),imshow(I_barrel),title('Barrel')
     subplot(3,3,9),imshow(I_pin),title('Pin Cushion')

    8b5e8a5acc1e1b411856820bcd1192c1.png

    请注意,subplot会更改正在显示图像的比例。


    注:本文根据MATLAB官网内容修改而成。

    可以看看以下的免费视频教程,特点是没有PPT,不掺水,直接编程环境下的实操课程:

    用100分钟了解MATLAB编程

    《MATLAB编程》视频课程 - 商业数据分析_数据可视化_Tableau免费课程_Tableau培训_自学Tableau_上海_1data.prowww.1data.pro
    9b9e6f3fb30613984daa628589614711.png

    欢迎您进一步了解以下MATLAB系列文章:

    吃小羊:MATLAB作图实例:00:索引zhuanlan.zhihu.com
    6fd2ba732720ee7b7d8417c48f8484e4.png
    吃小羊:MATLAB金融工具箱:00:索引zhuanlan.zhihu.com
    c5012d2e671b5364d0911ba23c64f315.png
    展开全文
  • Matlab图像处理教程

    2017-09-09 15:33:00
    虽然典型算法的开发是基于理论支持的,但这些算法的实现几乎总是要求参数估计,并常常进行算法修正与候选求解方案的比较。 ...图像处理工具箱IPT是一个MATLAB函数(称为M函数或M文件)集,它扩...

    虽然典型算法的开发是基于理论支持的,但这些算法的实现几乎总是要求参数估计,并常常进行算法修正与候选求解方案的比较。

    MATLAB由LINPACK和EISPACK项目开发,最初用于矩阵处理。今天,MATLAB已集成了LAPACK和BLAS库,并成为了矩阵计算的首选软件。MATLAB中补充了许多针对于特定应用的工具箱。图像处理工具箱IPT是一个MATLAB函数(称为M函数或M文件)集,它扩展了MATLAB解决图像处理问题的能力。其他有时用于补充IPT(Image Processing Toolbox,图像处理工具箱)的工具箱是信号处理、神经网络、模糊逻辑和小波工具箱。

    本书涵盖的图像处理范围

    第2章:基本原理。

    第3章:亮度变换和空间滤波。

    第4章:频率处理。

    第5章:图像复原。

    第6章:彩色图像处理。

    第7章:小波。

    第8章:图像压缩。

    第9章:形态学图像处理。

    第10章:图像分割。

    第11章:表示和描述。

    第12章:对象识别。

     

    转载于:https://www.cnblogs.com/2008nmj/p/7498366.html

    展开全文
  • matlab-digital-image-processing 这是一个matlab数字图像处理学习仓库
  • 本篇基于MATLAB图像处理 刘成龙著 第一章 个人笔记总结 MATLAB系统结构 系统结构由开发环境、数学函数、语言、图形处理系统和应用程序接口(API)五大部分组成。 MATLAB发展历史 初始是Fortran语言编写,后其内核...
  • MatImage是一个Matlab库,用于2D和3D中的图像处理和分析。 它包含250多个用于图像增强,过滤,分析或可视化以及创建基本测试形状的功能。 它是作为Mathworks图像处理工具箱(IPT)的补充而构建的。
  • MATLAB图像处理预处理的像素变幻RGB与灰度直方图 你好!首先我们来进行matlab的学习进步,了解到matlab里面自带的图像数据处理库,功能很强大。 可以进行MATLAB图像处理预处理的像素变幻RGB与灰度直方图的绘制 ...
  • MATLAB图像处理(裁剪)

    千次阅读 2020-11-28 12:49:40
    在进行深度学习时,可用于扩充图像库图像裁剪 matlab中的imcrop函数 I2=imcrop(I,[a b c d]); 对图像I进行裁剪,[a b c d]表示了一个区域,其中a是水平方向的坐标(从左往右),b是竖直方向上的坐标(从上到下),c是...
  • 这里面是标准图片数据集,平时都是一步步收集而来。里面包括4个文件夹。包括:256彩色图,例如...Standards Test Image,这是从各个信号与图像处理机构搜集而来,包括经典的24副大小为768*512的Kodak(柯达)PNG图像。
  • 我的目标,在MSCV上编写单通道8位的图像处理的函数, 函数处理对象为unsigned char 数组,并将此生成了动态。 使用MATLAB调用此动态。于是编写此工程。 matlabCallMsvcDll.m MATLAB主程序, CallMsvcDll.cpp ...
  • “形态学”一词通常指的是生物学的某个分支,常用来处理动物和植物的形状和结构。 在数学形态学中,将之作为提取图像分量的一种工具,这些分量表示和描述区域形状(如边界、骨骼、凸壳)。 问题分析的流程 问题 ...
  • Matlab 点云图像处理

    2020-05-01 00:48:13
    三维点云图像处理步骤 Matlab函数 https://ww2.mathworks.cn/help/vision/lidar-and-point-cloud-processing.html?s_tid=CRUX_lftnav
  • 一、背景意义 手写体数字识别是图像识别...手写数字识别系统需要实现手写数字图像的读取功能、特征提取功能、数字的模板特征的建立功能及识别功能。 二、理论基础 2.1 算法流程 首先,读入手写数字图片进行图像归一
  • 我在matlab中使用HOG cpp脚本(通过mex)和SVM-Light(http://svmlight.joachims.org/)我想知道如果他们离相机更近的话我怎么能检测到汽车(我知道我需要有不同尺寸的窗户我不知道如何实现它)以及如何告诉SVM不要检测...
  • 本程序主要运用for循环语句,和一些基本的函数:imread(读取图片)、cat(进行RGB各分量的组合)、imshow(绘制图像)。采用的图片为RGB彩色图片,像素大小为512×480,文件命名frutis.jpg,如下: (1)RGB分量...
  • 各种图像处理库

    千次阅读 2018-04-17 17:32:49
    python的图像处理库已有 8527 次阅读 2014-5-26 12:34 |个人分类:技术-方法|系统分类:科研笔记Matlab是一个商业软件,现在后悔一开始学习Matlab了。想慢慢转移到python平台,找找有哪些图像处理的库。1. ITK这是医学...
  • 想慢慢转移到python平台,找找有哪些图像处理。1.ITK这是医学图像处理最流行的了,虽然是使用C++语言编写的,但也提供了齐全的python绑定。在编译的时候,可以选择绑定python。这样就可以直接用python调用ITK...
  • 图像处理库综述

    2019-07-01 15:16:29
    当需要做一些图像处理方面的学习和研究的时候,首要任务就是选择一套合适的图像处理类库,本文主要简单介绍下各家图像的一些优缺点。OpenCV,Intel IPP,Halcon,MATLAB ,OpenGL,EmguCv,AForge.net,CxImage,...
  • [故事背景]在实验室研究计算机视觉相关课题,由于感觉Matlab、C和C++处理图片不太方便(其实主要是不熟悉),所以当初不顾导师的反对,毅然决然使用JavaScript搞起。经过将近一年的学习研究,终于提出了自己的算法,...
  • 图像处理库OpenXX简介

    2020-06-21 09:00:19
    图像处理库OpenXX简介 OpenCV . OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库, 实现了图像处理和计算机视觉方面的很多通用算法; . 可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效,...
  • 图像处理函数

    2014-01-27 23:56:14
    图像处理函数,应用于MATLAB。适用于图像处理基础操作。
  • Matlab中拥有着丰富的图像处理库,对于一些图像处理、研究特别方便。本文只是简单介绍一些常用的Matlab图像处理方法,仅供入门参考。首先我们先来看一些代码,以及其运行结果: I = imread('E:\Picture\lena.jpg');%...
  • Python图像处理库介绍

    千次阅读 2014-03-25 11:36:35
    Python图像处理库: 一:PIL PythonWare公司提供了免费的图像处理工具包 PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,...
  • 此问题棘手的原因主要有在Matlab编写的项目程序中用到了很多图像处理封装,经过多次尝试,最终在Visual Studio中成功调用。 C++调用Matlab可以有几种方式来实现:1)调用Matlab引擎;2)调用Matlab DLL。至于如何...
  • LTI-Lib 是一个包含图像处理和计算机视觉常用算法和数据结构的面向对象,提供 Windows 下的 VC 版本和 Linux 下的 gcc 版本,主要包含以下几方面内容:1、线性代数2、聚类分析3、图像处理4、可视化和绘图工具十九...
  • c++调用matlab实现图像处理

    千次阅读 2018-07-20 17:34:02
    3、目录添加以下文件 4、链接器中输入一下lib 5、以下程序启动matlab  Engine* ep = engOpen(NULL); 6、之后便可以使用matlab了,使用格式如下: engEvalString(ep, "。。。。。。。。。。。"...
  • 图像处理库综述 原文链接:http://blog.csdn.net/x454045816/article/details/52097224 当需要做一些图像处理方面的学习和研究的时候,首要任务就是选择一套合适的图像处理类库,本文主要简单介绍下各家图像库的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 987
精华内容 394
关键字:

matlab图像处理库

matlab 订阅