IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 超详细!教你用opencv对相似图片一键找不同。(嘻嘻,找不同小游戏作弊神器) -> 正文阅读

[人工智能]超详细!教你用opencv对相似图片一键找不同。(嘻嘻,找不同小游戏作弊神器)

前言
??找不同小游戏,大家或多或少都玩儿过,就是给你两幅相似的图片,里面会给你改变一些东西的形状,或者挪动位置,让你在规定时间内,找出两幅图的不同之处。可有时候图片信息过多或者太复杂,就会使我们找起来非常费劲儿。那有没有偷懒的方法呢?

??哈喽,小伙伴们好,这里是滑稽研究所。以上的问题能不能用python实现一键找不同呢?很显然除了生孩子外什么都会的python是可以做到的,只需要使用我们的opencv库,就可以实现我们想要的功能的。那么本期我们的任务就是识别下面图片素材中的不同之处,并标记出来。下图中除了比较明显的app的位置变化之外,4g信号的使用情况也不同(箭头一明一暗)。
??素材如下:

??**注意!**两个图片比较的先决条件必须处于同一环境,如我们截取定点监控摄像头的录像,在不同时间任意截取两张图片比较都是满足条件的。因为它拍摄的是同一地点,变化的只有行人和车辆。我们的素材也是在同一屏幕,不同情况下截取。
??那么先上代码,然后我们跟着不同阶段的图片处理结果来过一遍思路。
??源代码:

import cv2
import numpy as np

img = cv2.imread('images/3.png',0)
imgx = cv2.imread('images/3.png')
img2 = cv2.imread('images/4.png',0)
imgy = cv2.imread('images/4.png')
#缩放到合适大小
img=cv2.resize(img,None,fx=0.4,fy=0.4)
imgx=cv2.resize(imgx,None,fx=0.4,fy=0.4)
img2=cv2.resize(img2,None,fx=0.4,fy=0.4)
imgy=cv2.resize(imgy,None,fx=0.4,fy=0.4)

print(img.shape,img2.shape)

imgBlur = cv2.GaussianBlur(img, (7, 7), 1)
imgBlur2 = cv2.GaussianBlur(img2, (7, 7), 1)
# 获取图形轮廓
imgCanny = cv2.Canny(imgBlur, 50, 80)
imgCanny2 = cv2.Canny(imgBlur2, 50, 80)
#二值化操作
kernel = np.ones((5, 5), np.uint8)
ref = cv2.threshold(imgCanny, 10, 255, cv2.THRESH_BINARY_INV)[1]
ref2 = cv2.threshold(imgCanny, 10, 255, cv2.THRESH_BINARY)[1]
ref3 = cv2.threshold(imgCanny2, 10, 255, cv2.THRESH_BINARY_INV)[1]
#与运算
img4 = cv2.bitwise_and(imgCanny2,imgCanny2,mask=ref)
img5 = cv2.bitwise_and(ref2,ref2,mask=ref3)

res1 = cv2.add(img4,img5)

imgd = cv2.dilate(res1, kernel, iterations=2)

img1 = imgx.copy()

def getContours(img):
    contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    # contours接受识别出的所有轮廓
    # hierarchy各个轮廓之间的关系,我们本次用不到。
    for cnt in contours:
        area = cv2.contourArea(cnt)
        # 这个输出各个轮廓的面积
        #print(area)
        #if 0 <= area <=6000 :
        # 给我们的轮廓描边
        print(area)
        cv2.drawContours(img1, cnt, -1, (0, 255, 0), 2)
        # 轮廓的长度
        peri = cv2.arcLength(cnt, True)
        # 找出轮廓的突变值
        approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
        # approx找到的是一个轮廓有几个突变值,有几个角就会有几个突变值
        # 返回的是一个list,输出他的长度,就可以知道到底有几个角
        print(len(approx))

        x, y, w, h = cv2.boundingRect(approx)  # 得到包覆此轮廓的最小正矩形
        # x,y为包覆此轮廓的最小正矩形的左上角的坐标。
        # w, h则为长宽,计算长宽的比值判断矩形。
        # if 730 > x > 70 and 270 < y < 350:
        cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 0, 255), 2)

getContours(imgd)
#图片拼接操作
imga = np.hstack((img1,imgy))
imgb = np.hstack((imgCanny2,ref))
imgc = np.hstack((ref2,ref3))
imgd = np.hstack((img4,img5))

cv2.imshow("1", imga)
cv2.imshow("2", imgb)
cv2.imshow("3", imgc)
cv2.imshow("4", imgd)
cv2.imshow("8", res1)
# 设置窗口显示时间,0为永远。单位是ms。
cv2.waitKey(0)

??两张图片二值化之后,值取一正一反,注意需要做两组。为什么两组?

??第一次我们以左侧为原图,进行一次掩膜操作,右图作为mask。我们知道白色区域是我们希望保留的部分,覆盖之后,位置没有变的app轮廓被mask填充消失不见,那么得到下图的左侧部分。
??但是,我们发现一个问题,第2行和第4行app的位置变换没有被检测到。这是因为我们的原图app移动后的空缺处为黑色,而mask对应的位置即使有黑色轮廓也与背景色融合。无法被检测出来。因此我们需要进行一次反向取值。

??第二次操作反向取值之后我们得到上图的右侧部分。

??那么在两次操作之后我们对得到的结果进行一次加运算得到下图。我们可以看到在右上角的位置有片白色区域,那就是4g图标处的差异也被检测出来了。这意味着我们不仅可以检测到位置变换,还可以检测到图形的变换。也就是说如果位置不动,仅对调app的位置,那么logo和app名称的变化也是可以检测到的。

??我们对上图进行一次膨胀操作,以便程序可以更轻松的捕捉到我们的轮廓。在捕捉到轮廓后,我们对进行描边,并加上最小外接正矩形。

??最终结果:

??可以看到被移动的程序和信号的差别都被程序检测到了。那么到这一步,我们完成了就位置检测(app位置的移动)和图形检查(4g图标的不同)。
??其他素材测试:

??这里因为不需要关注细节处理,我们把膨胀操作去掉。在不同素材的情况下,我们灵活运用。
??最后,希望这篇文章对你理解opencv里的mask有帮助。

??转载自:滑稽研究所
??阅读更多相关文章,请关注我们吧!
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 21:59:15  更:2021-07-16 21:59:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:29:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码