opencv——图片找不同

本文介绍如何利用OpenCV库实现图片找不同功能。通过将一张包含左右两部分相似但有细微差别的图片分割,并对比这两部分的像素差异,用白色标记出不同之处。此方法适用于快速识别图像间的细微差别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信大家都玩过找不同的小游戏,对于相对复杂的图片有时候找花了眼也找不出其中的不同,正好现在在学习opencv,突然想通过opencv实现图片的找不同,这个也是非常的简单。直接上图片。这是从网上找的一张图片,如果出现侵权请联系我删除。这幅图片看起来比较简单,可以很容易的找到,下面通过代码来实现。

首先这是一副完整的图像分为左右两边,在若干部位出现不同,先把图片看成是两幅基本相同的图像拼接在一起,那么出现不同的地方一定是两幅图片中相同的部分,所以只要找出相同的位置不同的颜色显示并标记出来即可。代码实现:图片分为两块进行遍历找出不同。

代码如下

#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/opencv.hpp>
using namespace cv;
#include"iostream"
using namespace std;
Mat find_diff(Mat img){
	int imgrow=img.rows;
	int imgcol=img.cols;
	int channel=img.channels();
	Mat out=Mat::zeros(imgrow,imgcol,CV_8UC3);//返回也是相同大小的图像
	for(int i=0;i<imgrow;i++){
		for(int j=0;j<imgcol/2;j++){   //imgcol/2是将图像从中间分为左右两边进行比较
			for(int k=0;k<channel;k++){
				out.at<Vec3b>(i,j)[k]=img.at<Vec3b>(i,j)[k];
				out.at<Vec3b>(i,j+imgcol/2)[k]=img.at<Vec3b>(i,j+imgcol/2)[k];
				if(out.at<Vec3b>(i,j)[k]!=out.at<Vec3b>(i,j+imgcol/2)[k]){
					out.at<Vec3b>(i,j)[k]=255;
					out.at<Vec3b>(i,j+imgcol/2)[k]=255;//255代表白色的像素值,不同地方用白色标记
				}
			}
		}
	}
	return out;
}
void main(){
	Mat img=imread("3.jpg",IMREAD_COLOR);
	cout << img.rows << " "<< img.cols << endl;
	Mat out=find_diff(img);
	imshow("sample",out);
	waitKey(0);
}

这里要考虑到读取图片的尺寸,用下面语句进行显示,这个牵扯到图片分割的imgcol/2的结果,如果不能被2整除,结果就会受到影响。

cout << img.rows << " "<< img.cols << endl;

上述代码的效果图如下所示,不同的地方被白色进行标记。

 

 

 

### 使用 OpenCV 实现图片匹配 #### 安装依赖库 为了使用 OpenCV 进行图片匹配,首先需要安装必要的 Python 库: ```bash pip install opencv-python pip install pyautogui ``` 这些命令会安装 `opencv-python` 和 `pyautogui`,后者用于获取屏幕截图并处理系统缩放比例[^2]。 #### 获取系统缩放比例 当涉及到屏幕上的图像匹配时,考虑到不同设备可能有不同的显示设置,因此获取系统的缩放比例是非常重要的。这可以通过 PyAutoGUI 来完成: ```python import pyautogui screen_width, screen_height = pyautogui.size() print(f"Screen resolution is {screen_width}x{screen_height}") ``` 这段代码可以帮助理解当前环境下的分辨率情况,进而调整后续操作中的参数以适应不同的显示器配置。 #### 图像预处理 在执行具体的匹配之前,通常会对源图像和目标模板做一些预处理工作,比如转换成灰度模式来减少颜色信息带来的干扰,提高效率;也可以通过高斯模糊等方式去除噪声点。这里展示一个简单的例子: ```python import cv2 def preprocess_image(image_path): img = cv2.imread(image_path) gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred_img = cv2.GaussianBlur(gray_img, (5, 5), 0) return blurred_img ``` 此函数读取给定路径的图片文件,并将其转化为更适合于进一步分析的形式——即灰色调版本并且经过轻微平滑化处理后的形式[^3]。 #### 执行 NCC 模板匹配 NCC(标准化互相关)是一种广泛应用于图像识别领域的方法之一,在寻两幅或多幅之间相似之处方面表现良好。下面是一个基于 OpenCV 的简单实现方式来进行单次最佳位置定位: ```python template = preprocess_image('path_to_template.png') source = preprocess_image('path_to_source_image.png') result = cv2.matchTemplate(source, template, method=cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) top_left_corner = max_loc bottom_right_corner = ( top_left_corner[0] + template.shape[1], top_left_corner[1] + template.shape[0] ) cv2.rectangle( source, top_left_corner, bottom_right_corner, color=(0, 255, 0), thickness=2 ) cv2.imshow('Matched Image', source) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述脚本展示了如何加载两个预先准备好的图像作为输入数据集的一部分,接着运用内置函数 `matchTemplate()` 计算两者间的最大响应值及其对应坐标,最后绘制矩形框标记出检测到的最佳匹配区域[^1]。 #### 多结果匹配 如果希望不仅仅局限于找出单一最优解而是能够返回所有符合条件的结果,则可以在设定好合适的阈值之后遍历整个结果矩阵,筛选出满足条件的位置集合: ```python threshold = 0.8 # 需要根据实际情况调整 locations = [] while True: _, max_val, _, max_loc = cv2.minMaxLoc(result) if max_val < threshold: break locations.append(max_loc) h, w = template.shape[:2] result[max_loc[1]-h//2:max_loc[1]+h//2+1, max_loc[0]-w//2:max_loc[0]+w//2+1] = 0 ``` 该循环结构不断重复直到不到任何超过指定阈值得分为止,期间每次迭代都会记录下新的最高得分点并将附近一定范围内的分数置零以防重复选取同一特征区段。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值