在灰度图像的基础上,在灰度图截取一段区域,大小n*n,提取这个区域的特征值当作模板, 以n*n图象块的方式遍历图像,分别提取每个图像块的特征值,并通过基于模板的特征匹配来输出相似图像块的区域,模板匹配为基于欧式距离的模板匹配的c++代码
时间: 2024-03-09 18:45:18 浏览: 62
模板匹配,可将目标图片中与模板图片相似的部分寻找出来c++
以下是基于欧式距离的模板匹配的C++代码:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 读入灰度图像
Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
if (img.empty()) {
cout << "Could not read the image" << endl;
return -1;
}
// 定义模板
int n = 5; // 模板大小为n*n
Mat templateMat(n, n, CV_8UC1);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
templateMat.at<uchar>(i, j) = img.at<uchar>(i, j); // 提取灰度值作为模板
}
}
// 遍历图像块,进行模板匹配
int matchMethod = TM_SQDIFF_NORMED; // 使用平方差归一化模板匹配方法
double threshold = 0.1; // 阈值,决定相似度的大小
Mat result;
Point minLoc, maxLoc;
for (int i = 0; i < img.rows - n; i++) {
for (int j = 0; j < img.cols - n; j++) {
Mat block = img(Rect(j, i, n, n)); // 获取当前图像块
matchTemplate(block, templateMat, result, matchMethod); // 进行模板匹配
double similarity = result.at<float>(0, 0); // 获取相似度
if (similarity < threshold) { // 如果相似度大于阈值,则认为是相似的区域
minMaxLoc(result, &similarity, NULL, &minLoc, &maxLoc); // 获取相似度最小值的位置
rectangle(img, Point(j + minLoc.x, i + minLoc.y), Point(j + minLoc.x + n, i + minLoc.y + n), Scalar(0, 0, 255), 2); // 在原图上绘制矩形框
}
}
}
imshow("Matching result", img);
waitKey(0);
return 0;
}
```
此代码实现了在灰度图像的基础上,以n*n图像块的方式遍历图像,分别提取每个图像块的特征值,并通过基于模板的特征匹配来输出相似图像块的区域。
阅读全文