Main函数
#include "stdafx.h"
#include "MorphoFeatures.h"
#include "WatershedSegmenter.h"
int main()
{ cv::Mat img = cv::imread("../../aTestImage/Building.jpg", 0);//cv::IMREAD_GRAYSCALE
MorphoFeatures morp;
morp.setThreshold(-1);
cv::Mat corners=morp.getCorners(img);
//获取梯度(gradient)图像 //均匀变化的像素被过滤掉 //得到角点图像的 边缘图像
cv::morphologyEx(corners, corners, cv::MORPH_TOPHAT, cv::Mat());
cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV);//阈值化角点图像
//cv::namedWindow("corners1", 1);
//cv::imshow("corners1", corners);
morp.drawOnImage(corners, img);
cv::namedWindow("imgCorn" );
cv::imshow("imgCorn", img );
MorphoFeatures morp;
morp.setThreshold(-1);
cv::Mat corners=morp.getCorners(img);
//获取梯度(gradient)图像 //均匀变化的像素被过滤掉 //得到角点图像的 边缘图像
cv::morphologyEx(corners, corners, cv::MORPH_TOPHAT, cv::Mat());
cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV);//阈值化角点图像
//cv::namedWindow("corners1", 1);
//cv::imshow("corners1", corners);
morp.drawOnImage(corners, img);
cv::namedWindow("imgCorn" );
cv::imshow("imgCorn", img );
MorphoFeatures.h
#include
#include
#include
class MorphoFeatures
{
public:
MorphoFeatures();
~MorphoFeatures();
cv::Mat getEdges(const cv::Mat &image);//边缘检测
void applyThreshold(cv::Mat &result);
void setThreshold(int d);
cv::Mat getCorners(const cv::Mat &image);//角点检测
void drawOnImage(const cv::Mat &binary, cv::Mat &image);
private:
int threshold;//阈值
cv::Mat cross;//十字矩阵
cv::Mat diamond;//菱形矩阵
cv::Mat square;//正方形矩阵
cv::Mat x;//x形矩阵
};
MorphoFeatures.cpp
#include "stdafx.h"
#include "MorphoFeatures.h"
MorphoFeatures::MorphoFeatures():threshold(-1),
cross(5, 5, CV_8U, cv::Scalar(0)),
diamond(5, 5, CV_8U, cv::Scalar(1)),
square(5, 5, CV_8U, cv::Scalar(1)),
x(5, 5, CV_8U, cv::Scalar(0))
{
//threshold = -1;
//cross = cv::Mat(5, 5, CV_8U, cv::Scalar(0));
//diamond = cv::Mat(5, 5, CV_8U, cv::Scalar(1));
//square = cv::Mat(5, 5, CV_8U, cv::Scalar(1));//初始化正方形矩全是1
//x = cv::Mat(5, 5, CV_8U, cv::Scalar(0));
//初始化十字矩 结构元素
for (int i = 0; i < 5; i++)
{
cross.at(2, i) = 1;
cross.at(i, 2) = 1;
}
//初始化菱形矩 结构元素
diamond.at(0, 0) = 0;
diamond.at(0, 1) = 0;
diamond.at(1, 0) = 0;
diamond.at(4, 4) = 0;
diamond.at(3, 4) = 0;
diamond.at(4, 3) = 0;
diamond.at(4, 0) = 0;
diamond.at(4, 1) = 0;
diamond.at(3, 0) = 0;
diamond.at(0, 4) = 0;
diamond.at(0, 3) = 0;
diamond.at(1, 4) = 0;
//初始化X形矩 结构元素
for (int i = 0; i < 5; i++)
{
x.at(i, i) = 1;
x.at(4 - i, i) = 1;
}
}
MorphoFeatures::~MorphoFeatures()
{
}
cv::Mat MorphoFeatures::getEdges(const cv::Mat & image)
{
cv::Mat result;
cv::morphologyEx(image, result, cv::MORPH_GRADIENT, cv::Mat());
//获取梯度(gradient)图像 //均匀变化的像素被过滤掉 //得到边缘图像
applyThreshold(result);
return result;
}
void MorphoFeatures::applyThreshold(cv::Mat & result)
{
if (threshold > 0)
{
cv::threshold(result, result, threshold, 255, cv::THRESH_BINARY);
}
}
void MorphoFeatures::setThreshold(int thre)
{
threshold = thre;
}
cv::Mat MorphoFeatures::getCorners(const cv::Mat & image)
{
cv::Mat result;
cv::dilate(image, result, cross);//十字膨胀
cv::erode(result, result, diamond);//菱形腐蚀
cv::Mat result2;
cv::dilate(image, result2, x);//X形膨胀
cv::erode(result2, result2, square);//正方形腐蚀
cv::absdiff(result2, result, result);//结果求差值,得角点图像
applyThreshold(result);//阈值化,得二值图像
return result;
}
void MorphoFeatures::drawOnImage(const cv::Mat & binary, cv::Mat & image)
{
cv::Mat_::const_iterator it = binary.begin();
cv::Mat_::const_iterator itend = binary.end();
for (int i = 0; it != itend; ++it, ++i)
{
if (!*it)
{
//在原始图像上画像素5*5的圆圈
cv::circle(image,
cv::Point(i % image.step, i / image.step),
5, cv::Scalar( 255,0,0));
}
}
}