形态学其他操作:
开运算、闭运算、顶帽、黒帽、形态学梯度
基于膨胀腐蚀基础, 利用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变换(顶帽运算)
顶帽运算也被称为”礼帽”, 是闭运算结果和原图像做差的结果, 可以用来分离比邻近点亮一些的斑块。
黑帽运算是原图像和开运算做差的结果, 可以用来分离比邻近点暗一些的斑块。