基於matlab的計算機視覺應用

1、基礎功能:

  1. (1)在命令行窗口輸入‘doc 函數’,如圖:
    在這裏插入圖片描述
    (2)彈出頁面即爲函數的功能,如圖:
    在這裏插入圖片描述


    shell

  2. 在命令行窗口輸入代碼時,若不須要輸出結果,則在代碼句末尾加‘;’,再回車;若須要輸出結果,則直接回車便可。如圖:
    在這裏插入圖片描述
    數組

  3. 在命令行窗口輸入‘clc’,會清空命令行窗口。如圖:
    在這裏插入圖片描述
    在這裏插入圖片描述

    函數

  4. matlab中第一個值從1開始計數。ui

2、項目一:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma); 
%h = fspecial(type,para)
%type指定算子的類型,para指定相應的參數
%gaussian爲高斯低通濾波器

surf(gaus)
%surf命令繪製着色的三維曲面
axis off
%關閉全部的座標軸標籤、刻度、背景

運行程序,輸出如圖:
在這裏插入圖片描述
spa

3、項目二:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma);
%函數fspecial(type,para):創建預約義的二維濾波模板。
%其中,type:算子的類型,para:相應的參數
%gaussian爲高斯低通濾波器

imagesc(gaus)
%採用線性映射會對數據進行縮放後,顯示圖像
colormap (hot)
%函數繪製表面圖時,colormap(即色圖)決定圖片的顏色。

運行程序,輸出如圖:
在這裏插入圖片描述
命令行

4、項目三:

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, []);
%自動調整數據的範圍以便於顯示。

運行程序,輸出如圖:
在這裏插入圖片描述
3d

5、項目四:

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]範圍內的圖像

運行程序,輸出如圖:
在這裏插入圖片描述
code

6、項目五:

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中第一、二、一、2的值賦給X2,取出Y中第一、一、三、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)
%顯示圖像

運行程序,輸出如圖:
在這裏插入圖片描述
在這裏插入圖片描述

orm

7、項目六:

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('放縮');

運行程序,輸出如圖:在這裏插入圖片描述blog

8、做業一:

  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. 文件二: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

運行程序a1_script,輸出如圖:
在這裏插入圖片描述
位置變換過程當中各矩陣,如圖:
在這裏插入圖片描述
像素填充過程當中各矩陣,如圖:
在這裏插入圖片描述

相關文章
相關標籤/搜索