基於matlab的計算機視覺應用

2020-10-29 12:00:37

一、基礎功能:

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

  2. 在命令列視窗輸入程式碼時,若不需要輸出結果,則在程式碼句末尾加‘;’,再回車;若需要輸出結果,則直接回車即可。如圖:
    在這裡插入圖片描述

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

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

二、專案一:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma); 
%h = fspecial(type,para)
%type指定運算元的型別,para指定相應的引數
%gaussian為高斯低通濾波器

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

執行程式,輸出如圖:
在這裡插入圖片描述

三、專案二:

width = 19;
sigma = 3;
gaus = fspecial('gaussian', width, sigma);
%函數fspecial(type,para):建立預定義的二維濾波模板。
%其中,type:運算元的型別,para:相應的引數
%gaussian為高斯低通濾波器

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

執行程式,輸出如圖:
在這裡插入圖片描述

四、專案三:

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

執行程式,輸出如圖:
在這裡插入圖片描述

五、專案四:

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]範圍內的影象

執行程式,輸出如圖:
在這裡插入圖片描述

六、專案五:

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)
%顯示影象

執行程式,輸出如圖:
在這裡插入圖片描述
在這裡插入圖片描述

七、專案六:

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

執行程式,輸出如圖:在這裡插入圖片描述

八、作業一:

  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,輸出如圖:
在這裡插入圖片描述
位置變換過程中各矩陣,如圖:
在這裡插入圖片描述
畫素填充過程中各矩陣,如圖:
在這裡插入圖片描述