Aplicación de visión por computadora basada en matlab

1. Funciones básicas:

  1. (1) Ingrese ' doc 函数' en la ventana de la línea de comando , como se muestra en la figura:
    Inserte la descripción de la imagen aquí
    (2) La página emergente es la función de la función, como se muestra en la figura:
    Inserte la descripción de la imagen aquí

  2. Al ingresar el código en la ventana de la línea de comando, si no necesita generar el resultado, agregue ' ;' al final de la oración del código y presione Enter; si necesita generar el resultado, simplemente presione Enter. Como se muestra:
    Inserte la descripción de la imagen aquí

  3. Si ingresa ' clc' en la ventana de la línea de comandos, se borrará la ventana de la línea de comandos. Como se muestra:
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí

  4. El primer valor en matlab comienza a contar desde 1.

2. Proyecto 1:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma); 
%h = fspecial(type,para)
%type指定算子的类型,para指定相应的参数
%gaussian为高斯低通滤波器

surf(gaus)
%surf命令绘制着色的三维曲面
axis off
%关闭所有的坐标轴标签、刻度、背景

Ejecute el programa, la salida es como se muestra:
Inserte la descripción de la imagen aquí

3. Proyecto 2:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma);
%函数fspecial(type,para):建立预定义的二维滤波模板。
%其中,type:算子的类型,para:相应的参数
%gaussian为高斯低通滤波器

imagesc(gaus)
%采用线性映射会对数据进行缩放后,显示图像
colormap (hot)
%函数绘制表面图时,colormap(即色图)决定图片的颜色。

Ejecute el programa, la salida es como se muestra:
Inserte la descripción de la imagen aquí

4. Proyecto tres:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma);
%函数fspecial(type,para):建立预定义的二维滤波模板。
%其中,type:算子的类型,para:相应的参数
%gaussian为高斯低通滤波器
g = imfilter(gaus, gaus, 'symmetric', 'same');
%对任意类型数组或多维图像进行滤波
%I = imfilter(f, w, filtering_mode, boundary_options, size_optinos)%I为滤波结果,f是输入图像,w为滤波模板
%filtering_mode为滤波模式,boundary_options为边界选项,size_optinos为大小选项
figure;imshow(g, []);
%imshow(I,[low high])显示灰度图像I,以二元素向量 [low high] 形式指定显示范围。

sigma = 16;
noise = randn(size(g))*sigma;
%randn(n)返回一个n*n的随机项的矩阵。如果n不是个数量,将返回错误信息。
g_n = gaus + noise;
figure;imshow(g_n, []);
%自动调整数据的范围以便于显示。

Ejecute el programa, la salida es como se muestra:
Inserte la descripción de la imagen aquí

5. Proyecto cuatro:

im_R = imread('E:\Matlab\rabbit.jpg');
%读取图像
im_R_g = rgb2gray(im_R);
%函数rgb2gray:将图像转换为灰度图像
im_r_g = double(im_R_g);
%将图像转换为double型进行运算
im_r_g(7, 9)
%索引特定像素的灰度值
figure;imshow(im_R)
figure;imshow(im_R_g, [40 100])
%显示灰度值在[LOW HIGH]范围内的图像

Ejecute el programa, la salida es como se muestra:
Inserte la descripción de la imagen aquí

6. Proyecto cinco:

img_M = imread('E:\Matlab\mouse.jpg');
%imread:读取图像
figure;imshow(img_M)
%imshow:显示图像
[X Y] = ginput(4);
%ginput(n):能够从当前轴标识n个点,并在x和y列矢量中返回这些点的x和y坐标
X2 = [X(1:2); X(1:2)];
Y2 = [Y(1); Y(1); Y(3) + 50; Y(3) + 50];
%取出X中第1、2、1、2的值赋给X2,取出Y中第1、1、3、3的值进行相应
%matlab中第一个值从1开始计数
tform = maketform('projective', [X Y], [X2 Y2]); 
%函数maketform(a,b):创建TFORM结构体。
%其中,a:希望执行变换的类型,b:变换矩阵。
%’projective’:投影变换。
img_M_out = imtransform(img_M, tform, 'bicubic');
%函数imtransform(a,tform,b):图像的空间变换,返回变换后的图像。a:输入变换的图像,b:TFORM结构体
%'bicubic'为三次插值
figure;imshow(img_M_out)
%显示图像

Ejecute el programa, la salida es como se muestra:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

7. Proyecto seis:

img = imread('E:\Matlab\cat.jpg')

se = translate(strel(1), [20 10]);
%translate(SE, [y y])%将图像img向下、向右移动20、10个位置
img_m = imdilate(img, se);
%imdilate(img, se):利用膨胀函数平移图像img
img_t = imrotate(img_m, 45);
%imrotate(img, theta):将图像img旋转theta度
img_e = imresize(img_t, 0.5);
%imresize(img, s):将图像img放大s倍

figure;imshow(img)
title('原图');
figure;imshow(img_m)
title('平移');
figure;imshow(img_t)
title('旋转');
figure;imshow(img_e)
title('放缩');

Ejecute el programa, la salida es como se muestra:Inserte la descripción de la imagen aquí

8. Tarea 1:

  1. Archivo 1: a1_script.m
img = imread('4.1.05.tiff');
%img = imread(‘filename’):根据文件名filename读取尺寸为M*N的灰度或彩色图像数据,储存在数组img中。
%若文件为灰色图像,则img是M*N的数组;若文件名为彩色图像,A是M*N*3的数组。
figure; imshow(img);
% imshow():将图像以原始尺寸显示。
title('RGB');
%设置图片标题。

img_g = rgb2gray(img);
%将彩色图像转换为灰度图像
figure; imshow(img_g);
title('Gray');

img_process = my_similarity(img, 100, -10, 20, 0.2);
%img_process为my_similarity的实际输出参数。
figure; imshow(img_process);
title('Process');
  1. Archivo 2: my_similarity.m
 function [img_p_inter] = my_similarity(img, dx, dy, theta, s)
%function [输出]= fun(输入):定义函数my_similarity,fun为函数名,参数为img、dx、dy、theta、s。
%img_p_inter为my_similarity的形式输出参数。

V = [linspace(1, 1, 256); 1:1:256];
%定义图片的坐标矩阵V(不含像素值),用于变换。
%[;]':将行数为2的矩阵进行转置。
%linspace(x1, x2, n):在区间(x1, x2)中生成n个等距点。
%x1:a:x2:在区间(x1, x2)中生成间距为a的点。                                                          
for j = 2:256
    A1 = [linspace(j, j, 256); 1:1:256];
    V = cat(2, V, A1); 
    %x1:x2:在区间(x1, x2)中生成默认间距为1的点。
    %x1:a:x2:在区间(x1, x2)中生成间距为a的点。
    %cat(dim, A, B):按dim来联结A和B两个数组。
    %dim为1,[A; B];dim为2,[A, B];dim为3,A、B为两层。
end

M1 = linspace(dx, dx, 65536);
%linspace(x1, x2, n):在区间(x1, x2)中生成n个等距点。
M2 = linspace(dy, dy, 65536);
%linspace(x1, x2, n):在区间(x1, x2)中生成n个等距点。

M = [M1; M2];
%定义平移变换矩阵。
R = [cosd(theta), -sind(theta); sind(theta), cosd(theta)];
%定义旋转变换矩阵。
S = [s, 0; 0, s];
%定义缩放变换矩阵。
V_M = M + V;
%对图片进行平移。
V_M_R = R * V_M;
%对图片进行关于原点的逆时针旋转。
V_M_R_S = S * V_M_R;
%对图片进行缩放。

V_M_R_S_INT = uint8(V_M_R_S);
%uint8(x):u(无符号)+int(整型)+8(8位二进制)。把大于255的数强制置为255,而小于255且大于0的数则保持不变,小于0的数强制置为0。
%uint16的范围是0—65535,uint8的范围是0—255。
V_M_R_S_INT = V_M_R_S_INT + uint8(ones(2, 65536)); 
%ones(M, N):产生一个M*N的全1矩阵。
%整型化
%“V_M_R_S中各元素+1”的原因:由于uint8的范围为[0,255],而在matlab定义坐标是从1开始的。%


img_p = uint8(cat(3, ones(256, 256), ones(256, 256), ones(256, 256)));
%cat(dim, A, B):按dim来联结A和B两个数组。
%dim为1,[A; B];dim为2,[A, B];dim为3,A、B为两层。
%ones(M, N):产生一个M*N的全1矩阵。

for p = 1:3
    k = 1;
    for m = 1:256
        for n = 1:256
            img_p(V_M_R_S_INT(1, k), V_M_R_S_INT(2, k), p) = img(m, n, p);
            %将img的R、G、B三层的像素值赋给img_p
            k = k + 1;
        end
    end
end
%对虚拟图片进行像素填充。
%p:RGB维数,k:循环次数,m:坐标x,n:坐标y。
%变量img存放了R、G、B三层的像素值。
%V_M_R_S_INT:2行65536列的矩阵,存放4.1.05.tiff的各像素点位置信息。


Vq1 = interp2(single(img_p(:, :, 1)), 3);
%interp2:二维网格数据的插值
%interp2(V,k):将每个维度上样本值之间生成2^k-1个插入点。V为single类型。
%matlab用single类型存储数据,single类型占4个字节;用double类型存储数据,double类型占4个字节。
Vq2 = interp2(single(img_p(:, :, 2)), 3);
Vq3 = interp2(single(img_p(:, :, 3)), 3);
img_p_inter = uint8(cat(3, Vq1, Vq2, Vq3));
%cat(dim, A, B):按dim来联结A和B两个数组。
%dim为1,[A; B];dim为2,[A, B];dim为3,A、B为两层。
%插值
end

Ejecute el programa a1_script, y la salida es como se muestra en la figura:
Inserte la descripción de la imagen aquí
las matrices en el proceso de transformación de posición, como se
Inserte la descripción de la imagen aquí
muestra en la figura: las matrices en el proceso de relleno de píxeles, como se muestra en la figura:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/shine_00/article/details/109215636
Recomendado
Clasificación