本文章包含以下內(nèi)容:????????
1、灰度閥值分割
(1)單閾值分割圖像
先將一幅彩色圖像轉(zhuǎn)換為灰度圖像,顯示其直方圖,參考直方圖中灰度的分布,嘗試確定閾值;應(yīng)反復(fù)調(diào)節(jié)閾值的大小,直至二值化的效果最為滿意為止。給圖像加上零均值的高斯噪聲重復(fù)上述過程,注意閾值的選擇。
(2)多閾值分割圖像
自選圖像,對圖進行多閾值分割,注意閾值的選擇。
2.邊緣檢測
(1)使用Roberts 算子的圖像分割實驗,調(diào)入并顯示一幅圖像*.gif或*.tif;
使用Roberts 算子對圖像進行邊緣檢測處理;Roberts 算子為一對模板,相應(yīng)的矩陣為:
rh = [0 1;-1 0]; rv = [1 0;0 -1];?
這里的rh 為水平Roberts 算子,rv為垂直Roberts 算子。可以顯示處理后
的水平邊界和垂直邊界檢測結(jié)果;
用“歐幾里德距離”方式計算梯度的模,顯示檢測結(jié)果;對于檢測結(jié)果進行二值化處理,并顯示處理結(jié)果。
(2)使用Prewitt 算子的圖像分割實驗使用Prewitt 算子進行內(nèi)容(1)中的全部步驟。
(3)使用Sobel 算子的圖像分割實驗使用Sobel 算子進行內(nèi)容(1)中的全部步驟。
(4)使用Canny算子進行圖像分割實驗。
(5) 使用拉普拉斯算子進行圖像分割實驗。
代碼如下:
function U()
clear;
clc;
Single_threshold_segmentation()
Multi_threshold_segmentation()
edge_detection()
end
% 單閾值分割
% 先將一幅彩色圖像轉(zhuǎn)換為灰度圖像,顯示其直方圖,
% 參考直方圖中灰度的分布,嘗試確定閾值
% 給圖像加上零均值的高斯噪聲重復(fù)上述過程
function Single_threshold_segmentation()
img = imread('gantrycrane.png'); % 讀取圖像
figure('Name','單閾值分割'); % 開一個叫單閾值分割的窗口
subplot(2,4,1);imshow(img);title('gantrycrane.png原圖'); % 顯示原圖
img = rgb2gray(img); % 彩色圖像轉(zhuǎn)為灰度圖像
subplot(2,4,2);imshow(img);title('gantrycrane.png灰度圖'); % 顯示灰度圖
subplot(2,4,3);imhist(img);title('gantrycrane.png直方圖'); % 顯示直方圖
% x = 95; % 分割閾值
% img1 = uint8((0*(img<=x)+255.*(img>x))); % 圖像分割
x = graythresh(img); % 分割閾值
img1 = im2bw(img,x); % 圖像分割
subplot(2,4,4);imshow(img1);title('gantrycrane.png二值圖'); % 顯示二值圖
img = imnoise(img,'gaussian'); % 添加高斯噪聲
subplot(2,4,6);imshow(img);title('gantrycrane.png噪聲灰度圖'); % 顯示噪聲灰度圖
subplot(2,4,7);imhist(img);title('gantrycrane.png噪聲直方圖'); % 顯示噪聲直方圖
% x = 95; % 分割閾值
% img1 = uint8((0*(img<=x)+255.*(img>x))); % 圖像分割
x = graythresh(img); % 分割閾值
img1 = im2bw(img,x); % 圖像分割
subplot(2,4,8);imshow(img1);title('gantrycrane.png噪聲二值圖'); % 顯示噪聲二值圖
end
% 多閾值分割
function Multi_threshold_segmentation()
img = imread('cameraman.tif'); % 讀取圖像
figure('Name','多閾值分割'); % 開一個叫多閾值分割的窗口
subplot(2,2,1);imshow(img);title('cameraman.tif原圖'); % 顯示原圖
subplot(2,2,2);imhist(img);title('cameraman.tif直方圖'); % 顯示直方圖
x_1 = 77; % 分割閾值
x_2 = 139;
img1 = uint8(0*(img<=x_1)+round((x_1+x_2)/2)*((img>x_1)&(img<=x_2))+255*(img>x_2)); % 圖像分割
subplot(2,2,3);imshow(img1);title('gantrycrane.png分割圖'); % 顯示分割圖
end
% 邊緣檢測
% 使用Roberts,Prewitt,Sobel,Canny,拉普拉斯算子
function edge_detection()
img = imread('cameraman.tif'); % 讀取圖像
figure('Name','邊緣檢測'); % 開一個叫邊緣檢測的窗口
subplot(2,3,1);imshow(img);title('cameraman.tif原圖'); % 顯示原圖
img1 = ed(img,[[0 1;-1 0];[1 0;0 -1]]); % 使用 Roberts 算子
subplot(2,3,2);imshow(img1);title('Roberts 算子'); % Roberts 算子處理圖像
img1 = ed(img,[[-1 -1 -1;0 0 0;1 1 1];[-1 0 1;-1 0 1;-1 0 1]]); % 使用 Prewitt 算子
subplot(2,3,3);imshow(img1);title('Prewitt 算子'); % Prewitt 算子處理圖像
img1 = ed(img,[[-1 -2 -1;0 0 0;1 2 1];[-1 0 1;-2 0 2;-1 0 1;]]); % 使用 Sobel 算子
subplot(2,3,4);imshow(img1);title('Sobel 算子'); % Sobel 算子處理圖像
img1 = ed(img,[[-1 1;-1 1];[-1 -1;1 1]]); % 使用 Canny算子
subplot(2,3,5);imshow(img1);title('Canny算子'); % Canny算子處理圖像
img1 = ed(img,[[0 -1 0;-1 4 -1;0 -1 0];[-1 -1 -1;-1 8 -1;-1 -1 -1]]); % 使用 Laplace算子
subplot(2,3,5);imshow(img1);title('Laplace算子'); % Laplace算子處理圖像
end
% 進行卷積和二值化
function img2 = ed(img,x)
s = size(x);
img1 = zeros(size(img));
for i = 1:s(1)/s(2)
img1 = img1 + abs(conv2(img,x(1+s(2)*(i-1):s(2)*i,1:s(2)),'same'));
end
img1 = uint8(img1);
img2 = im2bw(img1,graythresh(img1));
end
結(jié)果如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-795761.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-795761.html
到了這里,關(guān)于利用Matlab進行圖像分割和邊緣檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!