1 建模
A.讀取圖像:
????????1.使用imread函數讀取圖像文件。
????????2.如果圖像是彩色的,通常需要先轉換為灰度圖像,因為大津閾值法通常應用于灰度圖像。
B.灰度化:
????????1.如果圖像是彩色的,使用rgb2gray函數將其轉換為灰度圖像。
????????2.灰度圖像只包含亮度信息,便于后續處理。
D.閾值分割:
????????1.使用大津閾值法(Otsu's method)計算全局閾值。
????????2.graythresh函數可以自動計算這個閾值。
????????3.使用imbinarize或邏輯運算(例如gray_image > threshold)將灰度圖像轉換為二值圖像。
E.連通區域標記:
????????1.使用bwlabel函數標記二值圖像中的連通區域。
????????2.這個函數會為每個獨立的連通區域分配一個唯一的標簽。
F.統計連通區域數量:
????????1.bwlabel函數在返回標記圖像的同時,也返回了連通區域的數量。
????????2.可以直接使用這個數量作為目標物體的計數。
G.可視化結果:
????????1.使用imshow函數顯示原始圖像、二值化圖像和標記后的圖像。
????????2.可以使用subplot函數將多個圖像放在同一個窗口中顯示。
????????3.可以使用label2rgb函數將標記圖像轉換為彩色圖像,以便于觀察不同的連通區域。
2 代碼
function segment_and_label_image(image_path) % 讀取圖像 original_image = imread(image_path); if size(original_image, 3) == 3 % 如果是彩色圖像,則轉換為灰度圖像 gray_image = rgb2gray(original_image); else gray_image = original_image; end % 使用大津閾值法計算閾值 threshold = graythresh(gray_image); % 根據閾值對圖像進行二值化處理 binary_image = imbinarize(gray_image, threshold); % 標記連通區域 [labeled_image, num_objects] = bwlabel(binary_image); % 顯示原始圖像 subplot(2, 2, 1); imshow(original_image); title('原始圖像'); % 顯示二值化圖像 subplot(2, 2, 2); imshow(binary_image); title('二值化圖像'); % 顯示標記連通區域后的圖像 subplot(2, 2, 3); imshow(label2rgb(labeled_image, 'jet', 'k', 'shuffle')); title(['連通區域標記,共檢測到 ', num2str(num_objects), ' 個對象']); % 等待用戶按鍵,然后關閉所有圖像窗口 pause; close all;
end segment_and_label_image('米粒.png'); % 替換為你的圖像路徑
3 運行結果
圖1?圖像目標計數結果