第十六届CISCN复现MISC——国粹

国粹

不是我说,我当时比赛的时候,在那里叭叭叭的数的老用心了结果他是一道非常不常规的图片密码题,又是一种我没见过的题型

 看了一些大佬的解题,知道他是一个坐标类型的图片拼凑

发现很多都提到了opencv,又是一个知识点盲区

浅浅了解一下

opencv:

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV主要用途的一些例子:

    图像处理:OpenCV提供了一系列用于处理图像的函数和算法,包括图像滤波、图像变换、图像分割、形态学操作等。

    特征检测与描述:OpenCV提供了用于检测和描述图像中的特征的函数和算法,例如SIFT、SURF、ORB、FAST等。

    目标检测与识别:OpenCV提供了用于目标检测和识别的函数和算法,例如Haar Cascade分类器、HOG+SVM分类器等。

    视频处理:OpenCV提供了一些用于处理视频的函数和算法,包括视频捕捉、视频压缩、视频分析等。

    机器学习:OpenCV提供了一些用于机器学习的函数和算法,例如支持向量机、神经网络、K均值聚类等。

下载题目

 点开图片a.png和图片k.png发现

两个图片大小一样

 我还认真数了一波a,k,当中图片的数量,发现都是341

但是这个地方,看了一下其他的方法,发现完全是可以因式分解的

看他宽的像素值,用在线因式分解的网站对其进行分解,因为每张牌的大小都是一样的,这个数一定可以被每张牌的宽度整除;

 然后再画图里看一下第一张牌和第二张牌的界限宽度,没有办法准确确定,只知道大概是 50
左右的样子,然后看到有因数是 53,那么大概率每张牌的宽度就是 53 了;

然后用18073/53

大概就是一共是341张牌;

题目的图片中牌数比较少,可以直接数出来是 42 张,第二排下面多了一张 1 万,按照思路题目这
样表是作为一个对照,这些牌按照顺序依次是 1,2,3 往后推,所以已经有了一张一万,下面
多的那张是没有用的;
a、k 两张图片的牌数一样,同时发现 a 的牌会出现一些重复,非常像坐标,所以我们下面
要做的任务就是把 a、k 两张图里的牌转化为相应的数字,再把牌一一对应,组合成 x、y 坐
标;
我们首先对图片进行切割,去网上找个脚本,改改就可以;

# -*- coding: utf-8 -*-
# 青少年网络安全 2022 03 30
from PIL import Image
 
filename = r'what.png'
img = Image.open(filename)
size = img.size
print(size)
# 大小为根号100
# 准备将图片切割成100张小图片
weight = int(size[0] // 10)
height = int(size[1] // 10)
# 切割后的小图的宽度和高度
print(weight, height)
 
for j in range(10):
    for i in range(10):
        box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
        region = img.crop(box)
        region.save('misc\\zxsctf_{}{}.png'.format(j, i))
 

图像切分脚本:

 a

 

 

 k

 了解过程中,发现又是一个陌生的库,PIL库

Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用 。
 

Python 中的 PIL 库_python pil_SteveKenny的博客-CSDN博客

一开始我想通过比较图片 md5 的方式进行,将 key 里面的图片按照顺序生成 md5 值,将
md5 值作为键,对应的序号作为值创建字典,然后 a、k 的文件夹用 for 循环依次遍历,每
次都计算图片的 md5 值,然后去查字典,取出相应的数值,由此可以得到两个坐标数组,
但是我在 md5 的代码写完运行之后发现,两张不同图片分割后虽然内容相同,但是图片的
md5 值不同,所以要想别的办法;

将a与k图像进行识别匹配,并将坐标保存,绘制为图像

图像识别+绘图脚本

import cv2
import numpy as np
import os
import turtle as t
import time
images=[]
x=[0 for i in range(343)]
y=[0 for i in range(343)]
 
 
for cuedir,dirs,filename in os.walk('C:\\Users\\Lenovo\\Desktop\\cuted'):
    for files in filename:
        f=eval(files.split(".")[0])#将.前面文件名单独储存,并化为数字
        images.append(f)#储存文件夹内的图片名称
images.sort()#整理文件名顺序
 
 
img_rgb = cv2.imread('C:\\Users\\Lenovo\\Desktop\\a.png')#识别图
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
#shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度
for i in range(len(images)):
    template = cv2.imread(f'C:\\Users\\Lenovo\\Desktop\\cuted\\{images[i]}.png', 0)  # 识别模板
    h, w = template.shape[:2]  # 读取宽高
    result = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)#标准相关匹配
    threshold = 0.9
    # 取匹配程度大于%90的坐标
    loc = np.where(result >= threshold)
    #print(loc)
    # np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序
    for pt in zip(*loc[::-1]):
        #print(pt)
        m=pt[0]//53
        x[m]=images[i]
        bottom_right = (pt[0] + w, pt[1] + h)
        cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)
cv2.imwrite("C:\\Users\\Lenovo\\Desktop\\x.jpg", img_rgb)
img_rgb = cv2.imread('C:\\Users\\Lenovo\\Desktop\\k.png')#识别图
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
#shape函数的功能是读取矩阵的长度
for i in range(len(images)):
    template = cv2.imread(f'C:\\Users\\Lenovo\\Desktop\\cuted\\{images[i]}.png', 0)  # 识别模板
    h, w = template.shape[:2]  # 读取宽高
    result = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)#标准相关匹配
    threshold = 0.9
    # 取匹配程度大于%90的坐标
    loc = np.where(result >= threshold)
    #print(loc)
    # np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序
    for pt in zip(*loc[::-1]):
        #print(pt)
        m=pt[0]//53
        y[m]=images[i]
        bottom_right = (pt[0] + w, pt[1] + h)
        cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)
cv2.imwrite("C:\\Users\\Lenovo\\Desktop\\y.jpg", img_rgb)#保存识别后的图片
cv2.waitKey(0)
for i in range(0,343):
    print(f'{x[i]} {y[i]}')
'''with open('C:\\Users\\Lenovo\\Desktop\\gnuplot.txt','w') as gn:
    for i in range(0,342):
        gn.write(f'{x[i]} {y[i]}\n')#坐标导出为一个txt文件'''
#绘制模块
t.speed(100)
t.pu()
for i in range(0,343):
    t.goto(y[i]*5,-x[i]*5)
    t.pd()
    t.circle(1,360)
    t.pu()
time.sleep(1000)#方便截图

 如果发现输出图片是反的,可以将x,y的位置互换一下

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考研算法32天:桶排 【桶排序】

算法介绍 桶排 举个例子,一个数组中的数是:4 1 2 3 5, 然后桶排的顺序是:将每个数应该在的下标算出来,咋算呢?这我们就得考虑两种情况:假设我们设现在这个需要找到自己在数组里位置的数是x。…

【计算机网络】IP 地址处理函数

目录 1.struct sockaddr_in的结构 2.一般我们写的结构 3.常见的“点分十进制” 到 ” uint32_t 的转化接口 3.1. inet_aton 和 inet_ntoa (ipv4) 3.2. inet_pton 和 inet_ntop (ipv4 和 ipv6) 3.3. inet_addr 和 inet_network 3…

哈工大计算机网络课程传输层协议之:拥塞控制原理剖析

哈工大计算机网络课程传输层协议之:拥塞控制原理剖析 哈工大计算机网络课程传输层协议详解之:可靠数据传输的基本原理 哈工大计算机网络课程传输层协议详解之:流水线机制与滑动窗口协议 哈工大计算机网络课程传输层协议详解之:T…

【裸机开发】EPIT 定时器 —— 按键消抖

实际工程中,不能直接通过延时来消抖 ! 这里我们采用定时器来消抖,这也是内核处理消抖的一种方式。 目录 一、基本原理 1、延时消抖的弊端 2、定时器消抖原理 二、按键消抖实现 1、按键中断 2、定时器中断 三、附加:按键 / 定时器中断初…

Qgis加载在线XYZ瓦片影像服务的实践操作

目录 背景 一、XYZ瓦片相关知识 1、xyz瓦片金字塔 2、 瓦片编号 3、瓦片访问 二、在Qgis中加载在线地图 1、Qgis版本 2、瓦片加载 3、地图属性预览 总结 背景 在做电子地图应用的时候,很常见的会提到瓦片(tile)的概念,瓦片…

【MySQL】MVCC是如何解决快照读下的幻读问题的

文章目录 LBCC当前读 MVCC隐藏列undo logRead View 总结 我们从上文中了解到InnoDB默认的事务隔离级别是repeatable read(后文中用简称RR),它为了解决该隔离级别下的幻读的并发问题,提出了LBCC和MVCC两种方案。其中LBCC解决的是当…

信号链噪声分析11

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 如今的射频(RF)系统变得越来越复杂。高度的复杂性要求所有系统指标(例如严格的 链接和噪声预算)达到最佳性能。确保整个信号链的正确设计至关重要。而信…

如何了解(海外抖音TiKToK)与国内抖音的区别以及介绍

一、海外抖音TK平台的优势 自从抖音在中国大受欢迎后,海外也推出了海外版抖音TK平台。尽管两者都是视频分享平台,但它们在一些方面具有明显的区别和独特的优势。下面将详细介绍海外抖音TK平台的优势以及与国内抖音的区别性。 优势: 1. 多元…

三防工业平板在哪些行业中得到广泛应用?

随着科技的不断进步,工业平板正逐渐成为各行业中不可或缺的工具。其中,三防工业平板由于其卓越的耐用性和丰富的功能,在许多行业中得到了广泛的应用。本文将重点介绍三防工业平板在以下几个行业中的应用。 三防工业平板在物流行业中发挥着关键…

vue-router.esm.js:2248 Error: Cannot find module ‘@/views/dylife/ 报错解决

具体是展示 一直加载 控制台报找不到模块 webpack版本问题,webpack4 不支持变量方式的动态 import ,新版本需要使用 require() 来解决此问题。 return () > import(/views/${view}) 改写成 return (resolve) > require([/views/${view}], reso…

【三层交换机】网络杂谈(16)之三层交换机技术

涉及知识点 什么是三层交换机,三层交换技术的由来,三层交换机,三层交换的应用范例。深入了解三层交换机技术。 原创于:CSDN博主-《拄杖盲学轻声码》,更多内容可去其主页关注下哈,不胜感激 文章目录 涉及知…

HBase(5):导入测试数据集

1 需求 将ORDER_INFO.txt 中的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。 可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢? 2 执行command文件 2.1 上传command文件 将该数据集文件上传到指…

6.5 指令与文件的搜寻

6.5.1 指令文件名的搜寻 在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。 which (寻找“可执行文件”) 这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名。所以&…

DETR系列:RT-DETR(一) 论文解析

论文:《DETRs Beat YOLOs on Real-time Object Detection》 2023.4 DETRs Beat YOLOs on Real-time Object Detection:https://arxiv.org/pdf/2304.08069.pdf 源码地址:https://github.com/PaddlePaddle/PaddleDetection/tree/develop/conf…

【Visual Studio】报错 ASSERT: “i >= 0 i < size()“,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C 语言,配合 Qt 开发串口通信界面。 文…

javaweb学习2

p标签使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!--p标签定义段落 p元素自动在其前后创建一段空白--> hello&#xff0c;world &l…

设计模式之访问者模式笔记

设计模式之访问者模式笔记 说明Iterator(访问者)目录访问者模式示例类图抽象访问者角色类抽象元素角色类宠物猫类宠物狗类自己类其他人类家类测试类 说明 记录下学习设计模式-访问者模式的写法。JDK使用版本为1.8版本。 Iterator(访问者) 意图:表示一个作用于某对象结构中的…

日历组件 el-calendar 实现标记功能

需求&#xff1a;在日历组件中选择月份时&#xff0c;可以显示当月已经质检或需质检的数据 思路&#xff1a;前端每次点击日期选择器的时候调用接口&#xff0c;接口返回当月需要质检或已质检的数据&#xff0c;前端拿到数据就开始做判断然后回显。 大体样式 代码&#xff1a…

Redis7【① 概述 安装 配置】

1. Redis入门概述 1. Redis是什么 Redis全称 远程字典服务器&#xff08;Remote Dictionary Server&#xff09;&#xff0c;它是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的基于内存的Key-Value数据库&#xff0c;提供了丰富的数据结构&…

windows无法启动RemoteDesktopServices服务(位于本地计算机上)。错误126:找不到指定的模块。

win10的搜索栏输入 注册表编辑器。打开&#xff0c;找到如下路径 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService\Parameters 将指定数值项ServiceDll的数值数据改成默认值&#xff1a; %SystemRoot%\System32\termsrv.dll 再重新尝试就好了。 …