A new cryptosystem based on Lucas functions
基于一道CTF题目,也就是如下。
123456789101112131415161718192021222324252627282930313233343536373839404142import randomfrom Crypto.Util.number import isPrimem, Q = """REDACTED""", 1def genPrimes(size): base = random.getrandbits(size // 2) << size // 2 base = base | (1 << 1023) | (1 << 1022) | 1 while True: temp = base | random.getrandbits(size // 4) if isPrime(temp): p = temp break while True: temp = base | ...
图像处理(10)综合各种高级算子
下面来介绍Scharr算子,他和sobel算子类似,只不过矩阵的边缘检测敏感度不同,也就是赋值更敏感。\begin{equation*}\text{Scharr}(x,y) = \frac{3}{2} \left[ \text{Sobel}(x+1,y+1) - \text{Sobel}(x-1,y-1) \right] - \frac{1}{2} \left[ \text{Sobel}(x+1,y-1) - \text{Sobel}(x-1,y+1) \right]\end{equation*}这是什么玩意,通俗的说,就是这样。\begin{equation*}G_x(x) =\begin{bmatrix}-3 & 0 & 3 \-10 & 0 & 10 \-3 & 0 & 3\end{bmatrix} \ , \G_y(x) =\begin{bmatrix}3 & 10 & 3 \0 & 0 & 0 \-3 & -10 & -3\end{bmatrix}\end{equation*}也 ...
图像处理(11)canny综合算子,边缘获取
12345import cv2 as cvimport numpy as npimport matplotlib.pyplot as pltimport ipykernelfrom IPython.display import Latex
12345678910#下面用这种综合的Canny方法img = cv.imread("def.jpg", cv.IMREAD_GRAYSCALE)v1 = cv.Canny(img, 100, 200)v2 = cv.Canny(img, 50, 100)v3 = cv.Canny(img, 200, 300)res = np.hstack((img, v1, v2, v3))cv.imwrite("canny.jpg", res)cv.imshow("canny", res)cv.waitKey(0)cv.destroyAllWindows() #一次完整的边缘检测过程
图像处理(2)阈值
首先导入库
12import cv2 as cvimport numpy as np
注意,最常见的阈值图片就是二维码。
1#本讲来看阈值,可以用来颠倒二维码噢!
查看两张图片,有颜色读取
12img1 = cv.imread("def.jpg", cv.IMREAD_COLOR)img2 = cv.imread("abc.jpg", cv.IMREAD_COLOR)
导入画图包,这个包在以后会非常常用
12#再来引入一下画图的包import matplotlib.pyplot as plt
1234567891011121314151617ret, thresh1 = cv.threshold(img1, 127, 255, cv.THRESH_BINARY)#只要大于127就设置为255,小于127设置为0,白变黑,黑变白ret, thresh2 = cv.threshold(img1, 127, 255, cv.THRESH_BINARY_INV)#反过来,小于127设置为0,大于127设置为255ret, thresh3 = cv.thr ...
图像处理(1)像素加法
基本读图操作与像素加法首先我们安装好opencv-python,只需要安装最新版本即可。
1import cv2 as cv
不管是什么版本,在导入的时候,都用上述命令即可,用cv便于书写。
1import matplotlib.pyplot as plt
导入绘图库,将会非常重要。
1img_cat = cv.imread("def.jpg", 1);
1表示以彩色方式读取图像,0表示以灰度模式读取图像,也就是单通道图像,只需要一个矩阵就能表示。
1img_dog = cv.imread("anc.jpg", 1)
加10创建了一个新图像,从原始图像中复制而来,原始图像中每个像素都加10,
12img_cat2 = img_cat + 10;img_cat2[:5, :, 0]#读取前五行和所有列,灰度图像
切片处理中[:5]表示仅仅处理前五行像素,:表示处理所有的列,而0表示通道0,在cv中通道顺序是BGR图像,所以是蓝色。
array([[ 0, 147, 156, ..., 210, 5, 166],
[248, 23 ...
图像处理(3)均值滤波
12import cv2 as cvimport numpy as np
图像滤波(低通滤波)1234img = cv.imread("def.jpg", cv.IMREAD_COLOR)cv.imshow('img', img)cv.waitKey(0)cv.destroyAllWindows()
卷积原理下面说一下卷积的原理。
显然,就是拿一个小矩阵在大矩阵上做点积乘法,得到一个值代替原来的像素。所以对于$n\cdot n$的矩阵,假设卷积核shi$m\cdot m$那么卷积之后的结果矩阵大小为$(n-m+1)\cdot (n-m+1)$,如图所示,卷积用来提取特征。
参数还有步长,也就是卷积核每次移动的单位。上面例子默认为1,如果步长为p,那么最终卷积结果的大小为
[\frac{(n-m) + 2p}{p}]可以带入尝试,结果正确,下面是代码。
1234blur = cv.blur(img, (5, 5))#进行平滑处理cv.imshow('blur', blur)cv.waitKey(0)cv.destroyAll ...
图像处理(5)膨胀操作
1234import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltimport ipykernel
接之前的腐蚀原理。我们直接调用膨胀函数。
1234567891011#膨胀操作,我们可以腐蚀操作之后,为了恢复对图像的损失,用膨胀操作。img = cv.imread('def.jpg', cv.IMREAD_COLOR)kernel = np.ones((5, 5), np.uint8)erosion = cv.erode(img, kernel, iterations=1)#进行腐蚀操作plt.imshow(erosion)plt.axis("off")plt.show()dilation = cv.dilate(erosion, kernel, iterations=1)#注意,在服饰的基础上膨胀,恢复了原图像plt.imshow(dilation)plt.axis("off")plt.show()即可看到先腐蚀后膨胀的图像,恢复了图像的损失并且去噪了 ...
图像处理(4)腐蚀操作
123import cv2 as cvimport numpy as npimport ipykernel
腐蚀原理这里是针对二值图像,黑白图像!可以说其矩阵元素是由0,1组成,0表示黑,1即255表示白。我们用一个全1的卷积核进行卷积,比如33的卷积核,每一次点乘运算的时候,如果图像中对应3\3个元素的值也都是1,这样最终结果就输出1,否则,全是0。
显然,上述操作就会导致,边界处外面是黑,里面是白,那么在边界处进行卷积时,结果会把原来像素位置变为0,也就是白色部分向内腐蚀!腐蚀可以迭代,显然迭代次数越多,边界越向内,腐蚀就会越深,一直到腐蚀没了!
其最大的作用就是比如在下图中,字上有一些非常刺眼的噪声,就是那些格格不入的白线。
我们用腐蚀几次就可以把噪声去除了!
1234567#腐蚀操作img = cv.imread("def.jpg", cv.IMREAD_COLOR)kernel = np.ones((5, 5), np.uint8)#矩阵表示核数,越大腐蚀越多erosion = cv.erode(img, kernel, iterations=1)#迭 ...
图像处理(7)梯度运算
1234import numpy as npimport cv2 as cvimport matplotlib.pyplot as pltimport ipykernel
1234567891011#梯度运算 = 膨胀-腐蚀,得到轮廓#膨胀 = 对象周围的像素值和自身像素值的最大值#腐蚀 = 对象周围的像素值和自身像素值的最小值img = cv.imread('def.jpg',cv.IMREAD_COLOR)kernel = np.ones((5,5),np.uint8)gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)cv.imshow('gradient',gradient)cv.waitKey(0)cv.destroyAllWindows()
图像处理(8)礼帽和黑帽
1234import cv2 as cvimport numpy as npimport matplotlib.pyplot as pltimport ipykernel
12345678910111213#礼帽 = 原图像 - 开运算,即原图像减去我们加强过的图像,就剩下轮廓噪音#黑帽 = 闭运算 - 原始图像,噪音减去噪音,应该只留下了轮廓img = cv.imread("def.jpg", cv.IMREAD_COLOR)kernel = np.ones((5, 5), np.uint8)topHat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)blackHat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)titles = ['Original', 'Top Hat', 'Black Hat']images = [img, topHat, blackHat]for i in range(3): ...