收入囊中
形态梯度
dst=morph_grad(src,element)=dilate(src,element)-erode(src,element)
|
(膨胀公式,灰度图像形态学膨胀与腐蚀此文都有介绍)
腐蚀操作对应的API erode和膨胀是一样的
其他形态学操作函数
|
Morphological gradient:
荷枪实弹
先介绍一个类
class MorphoFeatures {
private:
int threshold; //用于阀值操作
void applyThreshold(Mat& result) {
if (threshold>0)
cv::threshold(result, result,threshold, 255, THRESH_BINARY_INV); //注意参数是THRESH_BINARY_INV,当
int main( int, char** argv )
{
Mat image;
image = imread( argv[1] );
cvtColor( image, image, CV_RGB2GRAY );
MorphoFeatures morpho;
morpho.setThreshold(40);
Mat edges;
edges= morpho.getEdges(image);
namedWindow("dstImage", 1);
imshow("dstImage", edges);
waitKey();
return 0;
}
我们再基于公式自己实现一下,修改的地方很少,主函数没有变化(不一样的地方有注释)
class MorphoFeatures {
private:
int threshold;
Mat structedElement; //自己定义的结构矩阵
void applyThreshold(Mat& result) {
if (threshold>0)
cv::threshold(result, result,threshold, 255, THRESH_BINARY_INV);
}
public:
MorphoFeatures() : structedElement(3,3,CV_8U,Scalar(1)){} //没有使用API而是直接构造
void setThreshold(int x) {
threshold = x;
}
Mat getEdges(const Mat &image) {
Mat result,result1,result2;
dilate(image,result1,structedElement); //先膨胀
erode(image,result2,structedElement); //再腐蚀
result = result1 - result2; //然后相减
applyThreshold(result);
return result;
}
};
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
class MorphoFeatures {
private:
int threshold;
Mat structedElement;
void applyThreshold(Mat& result) {
if (threshold>0)
cv::threshold(result, result,threshold, 255, THRESH_BINARY_INV);
}
public:
MorphoFeatures() {
structedElement = getStructuringElement( MORPH_ELLIPSE, Size( 3, 3 ));
}
void setThreshold(int x) {
threshold = x;
}
Mat getEdges(const Mat &image) {
Mat result,result1,result2;
dilate(image,result1,structedElement);
erode(image,result2,structedElement);
result = result1 - result2;
applyThreshold(result);
return result;
}
};
int main( int, char** argv )
{
Mat image;
image = imread( argv[1] );
cvtColor( image, image, CV_RGB2GRAY );
MorphoFeatures morpho;
morpho.setThreshold(40);
Mat edges;
edges= morpho.getEdges(image);
namedWindow("dstImage", 1);
imshow("dstImage", edges);
waitKey();
return 0;
}