c++代码实现在灰度图像的基础上,在灰度图截取一段区域,大小n*n,提取这个区域的特征值当作模板, 以n*n图象块的方式遍历图像,分别提取每个图像块的特征值,并通过基于模板的特征匹配来输出相似图像块的区域,模板匹配为基于欧式距离的模板匹配,并对结果给出分析。
时间: 2024-03-22 16:37:12 浏览: 40
模板匹配,可将目标图片中与模板图片相似的部分寻找出来c++
以下是一个简单的C++实现,实现了对灰度图像的遍历以及模板匹配的过程:
```c++
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
vector<float> extractFeature(Mat img, int n, int x, int y) {
vector<float> feature;
int half = n / 2;
for (int i = x - half; i <= x + half; i++) {
for (int j = y - half; j <= y + half; j++) {
if (i >= 0 && i < img.rows && j >= 0 && j < img.cols) {
feature.push_back(img.at<uchar>(i, j));
}
}
}
// 计算特征值
float mean = accumulate(feature.begin(), feature.end(), 0.0) / feature.size();
float var = 0;
for (auto v : feature) {
var += pow(v - mean, 2);
}
var /= feature.size();
float grad = 0;
for (int i = 1; i < feature.size(); i++) {
grad += abs(feature[i] - feature[i - 1]);
}
feature.clear();
feature.push_back(mean);
feature.push_back(var);
feature.push_back(grad);
return feature;
}
void templateMatch(Mat img, Mat tpl, int n, float thresh) {
int tpl_x = tpl.cols / 2;
int tpl_y = tpl.rows / 2;
for (int i = tpl_x; i < img.cols - tpl_x; i++) {
for (int j = tpl_y; j < img.rows - tpl_y; j++) {
vector<float> feature = extractFeature(img, n, i, j);
float dist = 0;
for (int k = 0; k < feature.size(); k++) {
dist += pow(feature[k] - tpl.at<float>(k), 2);
}
dist = sqrt(dist);
if (dist < thresh) {
rectangle(img, Point(i - tpl_x, j - tpl_y), Point(i + tpl_x, j + tpl_y), Scalar(0, 0, 255), 1);
}
}
}
}
int main() {
// 读取灰度图像
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
// 生成模板
int n = 5; // 区域大小
int tpl_x = 200, tpl_y = 200; // 模板中心坐标
Mat tpl = Mat::zeros(1, 3, CV_32FC1);
tpl = extractFeature(img, n, tpl_x, tpl_y);
// 模板匹配
float thresh = 10; // 阈值
templateMatch(img, tpl, n, thresh);
// 显示结果
imshow("result", img);
waitKey(0);
return 0;
}
```
上述代码实现了在灰度图像上以n*n的图像块为单位遍历图像,并提取每个图像块的特征值。然后,我们使用生成的模板与每个图像块的特征值进行欧式距离的模板匹配,如果距离小于阈值,则认为该图像块与模板相似,并在该图像块的位置上画一个红色的矩形框。最后将匹配结果显示出来。
需要注意的是,上述代码中使用的模板匹配算法是基于欧式距离的,因此对于不同类型的图像,可能需要使用不同的匹配算法来实现更好的匹配效果。此外,阈值的选择也需要根据实际情况进行调整。
阅读全文