形態學其他操作:
開運算、閉運算、頂帽、黒帽、形態學梯度
基於膨脹腐蝕基礎, 利用morphologyEx()函數進行操作。
核心函數爲:
CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
src: 輸入原圖像。
dst: 輸出圖像要求和src一樣的尺寸和類型。
op: 表示形態學運算的類型, 可以取如下值:
enum { MORPH_ERODE=CV_MOP_ERODE, MORPH_DILATE=CV_MOP_DILATE,
MORPH_OPEN=CV_MOP_OPEN, MORPH_CLOSE=CV_MOP_CLOSE,
MORPH_GRADIENT=CV_MOP_GRADIENT, MORPH_TOPHAT=CV_MOP_TOPHAT,
MORPH_BLACKHAT=CV_MOP_BLACKHAT, MORPH_HITMISS };
kernel: 形態學運算內核, 若爲NULL, 表示使用參考點位於中心的3x3內核, 一般使用getStruecuringElement函數獲得。
anchor: 錨的位置, 默認值Point(-1,-1), 表示位於中心。
interations: 迭代使用函數的次數, 默認爲1。
borderType: 邊界模式, 一般採用默認值。
borderValue: 邊界值, 一般採用默認值。
一、開運算
開運算是先腐蝕後膨脹的過程, 開運算可以用來消除小物體, 在纖細點處分離物體, 並在平滑較大物體邊界的同時不明顯的改變其面積。
cv::morphologyEx(image, openedImage, cv::MORPH_OPEN, element);
代碼如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//加入椒鹽噪聲
void salt(Mat image, int n)
{
int i,j;
for (int k=0; k<n; k++)
{
// rand()是隨機數生成器
i= rand()%image.cols;
j= rand()%image.rows;
if (image.type() == CV_8UC1)
{ // 灰度圖像
image.at<uchar>(j,i)= 255;
}
else if (image.type() == CV_8UC3)
{ // 彩色圖像
image.at<cv::Vec3b>(j,i)[0]= 255;
image.at<cv::Vec3b>(j,i)[1]= 255;
image.at<cv::Vec3b>(j,i)[2]= 255;
}
}
}
int main( )
{
Mat image=imread("/Users/zhangxiaoyu/Desktop/lena.jpg");
if(image.empty())
{
cout<<"Error!cannot be read...../n";
return -1;
}
salt(image, 5000);
namedWindow("saltImage");
imshow("saltImage", image);
cv::Mat openedImage;
cv::Mat element3(3,3,CV_8U,cv::Scalar(1));
cv::Mat opened;
cv::morphologyEx(image, openedImage, cv::MORPH_OPEN, element3);
namedWindow("openedImage");
imshow("openedImage", openedImage);
waitKey(0);
}
如下圖所示:
二、閉運算
閉運算是先膨脹後腐蝕的過程, 閉運算可以用來消除小型黑洞(黑色區域)。
cv::morphologyEx(image, closedImage, cv::MORPH_CLOSE, element);
程序結果如下:
三、形態學梯度
形態學梯度是膨脹圖與腐蝕圖之差, 對二值圖可以將團塊(blob)邊緣凸顯出來, 可以用其來保留邊緣輪廓。
如下圖所示:
四、Top-Hat變換(頂帽運算)
頂帽運算也被稱爲”禮帽”, 是閉運算結果和原圖像做差的結果, 可以用來分離比鄰近點亮一些的斑塊。
黑帽運算是原圖像和開運算做差的結果, 可以用來分離比鄰近點暗一些的斑塊。