形态学变化

形态学变化

#include<opencv2/opencv.hpp>

//膨胀
cv::Mat pengZhang(cv::Mat img) {
	int h = img.rows;
	int w = img.cols;
	int step = img.rows * img.channels();
	cv::Mat pz = cv::Mat(img.size(), img.type());

	for (int i = 1; i < h - 1; i++) {

		uchar* data = img.ptr<uchar>(i);
		uchar* mdata = pz.ptr<uchar>(i);

		double maxValue = 0;
		for (int j = 1; j < w - 1; j++) {
			cv::Mat temp = img(cv::Range(i - 1, i + 2), cv::Range(j - 1, j + 2));
			cv::minMaxLoc(temp, NULL, &maxValue);
			mdata[j] = maxValue;
		}
	}

	return pz;

	/*
	cv::namedWindow("pengZhang", CV_WINDOW_AUTOSIZE);
	cv::imshow("pengZhang", pz);

	cv::Mat dilate_element = cv::getStructuringElement(
		cv::MORPH_RECT, cv::Size(3, 3));
	cv::Mat di;
	cv::dilate(img, di, dilate_element);

	cv::namedWindow("dilate", CV_WINDOW_AUTOSIZE);
	cv::imshow("dilate", di);

	cv::waitKey(0);
	*/

}

//腐蚀
cv::Mat fuShi(cv::Mat img) {
	int h = img.rows;
	int w = img.cols;
	int step = img.rows * img.channels();
	cv::Mat fs = cv::Mat(img.size(), img.type());

	cv::Mat temp;
	double minValue = 0;
	for (int i = 1; i < h - 1; i++) {

		uchar* data = img.ptr<uchar>(i);
		uchar* mdata = fs.ptr<uchar>(i);
		for (int j = 1; j < w - 1; j++) {
			temp = img(cv::Range(i - 1, i + 2), cv::Range(j - 1, j + 2));
			cv::minMaxLoc(temp, &minValue, NULL);
			mdata[j] = minValue;
		}
	}
	return fs;

	/*
	cv::namedWindow("fushi", CV_WINDOW_AUTOSIZE);
	cv::imshow("fushi", fs);

	cv::Mat erode_element = cv::getStructuringElement(
		cv::MORPH_RECT, cv::Size(3, 3));
	cv::Mat er;
	cv::erode(img,er, erode_element);
	cv::namedWindow("ercode", CV_WINDOW_AUTOSIZE);
	cv::imshow("ercode", er);

	cv::waitKey(0);
	*/

}

int main() {

	cv::Mat img = cv::imread("D:\\.jpg", 0);

	cv::Mat pyr;
	cv::pyrDown(img, pyr);
	cv::Mat fushi = fuShi(pyr);
	cv::Mat pengzhang = pengZhang(pyr);

	cv::Mat sub = cv::Mat(img.size(), img.type());

	if (fushi.rows == pengzhang.rows
		&& fushi.cols == pengzhang.cols
		&& fushi.type() == pengzhang.type()) {
	
		cv::addWeighted(pengzhang, 1, fushi, -1, 0, sub);
	}
	cv::namedWindow("sub", CV_WINDOW_AUTOSIZE);
	cv::imshow("sub", sub);
	cv::waitKey(0);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值