形态学变化
#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::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;
}
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;
}