文章目錄
- 使用腐蝕和膨脹圖像形態濾波器
- 實現案例
- 使用形態學濾波器對圖像進行開運算和閉運算
- 實現案例
- 在灰度圖像上應用形態學操作算子
- 形態學梯度(Morphological Gradient)
- 黑帽變換(Black-hat Transform)
- 使用分水嶺算法進行圖像分割
- 使用 MSER 提取顯著區域
- MSER 檢測與可視化
使用腐蝕和膨脹圖像形態濾波器
腐蝕(Erosion)和膨脹(Dilation)是最基本的形態學操作。
數學形態學中最基本的組成部分是結構元素(structuring element)。一個結構元素可以簡單地定義為一組像素的排列方式(如下圖中的方形結構),并在這組像素中定義一個原點(也稱為錨點)。
應用形態學濾波器的過程,就是使用這個結構元素去“探測”圖像中的每一個像素。當結構元素的原點與圖像中的某個像素對齊時,結構元素與圖像的交集就定義了一組像素,在這組像素上會執行特定的形態學操作(如下圖中陰影顯示的九個像素)。
結構元素可以是任意形狀的,常用的是簡單的形狀,例如方形、圓形或菱形,并且通常將原點置于中心位置。自定義的結構元素在某些情況下也非常有用,可以用于強調或消除具有特定形狀的區域。
實現案例
腐蝕和膨脹在OpenCV中通過簡單的函數實現,分別為cv::erode和cv::dilate
cv::Mat image = cv::imread("binary.bmp");
// 腐蝕圖像
// 使用默認的3x3結構元素(SE)
cv::Mat eroded; // 目標圖像
cv::erode(image, eroded, cv::Mat());// 膨脹圖像
cv::Mat dilated; // 目標圖像
cv::dilate(image, dilated, cv::Mat());
腐蝕操作將當前像素替換為在所定義的像素集中找到的最小像素值。
相反,膨脹是一個互補的操作,它將當前像素替換為最大像素值。由于輸入的二值圖像只包含黑色(值0)和白色(值255)像素,每個像素都將被替換成黑色或白色像素。
默認情況下,OpenCV使用3x3的方形結構元素。當在函數調用中指定一個空矩陣(即cv::Mat())作為第三個參數時,默認結構元素就會被使用。也可以通過提供一個非零元素定義結構元素的矩陣來指定任何大小(和形狀)的結構元素。例如,應用一個7x7的結構元素的方法如下:
// 創建一個包含所有1的7x7矩陣
cv::Mat element(7, 7, CV_8U, cv::Scalar(1));
// 使用該結構元素腐蝕圖像
cv::erode(image, eroded, element);// 腐蝕圖像3次
cv::erode(image, eroded, cv::Mat(), cv::Point(-1,-1), 3);
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>int main() {// 設置隨機數種子std::srand(std::time(nullptr));// 圖像尺寸int height = 400, width = 400;// 創建一個空的單通道灰度圖像cv::Mat image = cv::Mat(height, width, CV_8UC1);// 填充隨機值for(int y = 0; y < height; ++y) {for(int x = 0; x < width; ++x) {// 隨機生成0或255,以創建二值圖像image.at<uchar>(y, x) = (std::rand() % 2) * 255;}}// 創建用于存儲處理結果的圖像cv::Mat eroded, dilated;// 使用默認的3x3結構元素進行腐蝕操作cv::erode(image, eroded, cv::Mat());// 使用默認的3x3結構元素進行膨脹操作cv::dilate(image, dilated, cv::Mat());// 顯示原圖cv::imshow("Original Image", image);// 顯示腐蝕后的圖像cv::imshow("Eroded Image", eroded);// 顯示膨脹后的圖像cv::imshow("Dilated Image", dilated);// 等待用戶按鍵以關閉所有窗口cv::waitKey(0);return 0;
}
使用形態學濾波器對圖像進行開運算和閉運算
- 開運算(Opening) = 先腐蝕后膨脹
- 閉運算(Closing) = 先膨脹后腐蝕
// rc: 輸入圖像
// dst: 輸出圖像
// op: 操作類型,如 cv::MORPH_OPEN 或 cv::MORPH_CLOSE
// kernel: 結構元素(通常用 cv::getStructuringElement 創建)
cv::morphologyEx(src, dst, op, kernel);
實現案例
#include <opencv2/opencv.hpp>