利用sift算法在图片特征点中嵌入字符串用Python写一个示例
由于SIFT算法主要用于图像特征点的提取和匹配,不适合直接嵌入字符串。因此,我们可以借助SIFT算法提取出的特征点进行嵌入。
具体实现过程如下:
- 使用OpenCV库中的SIFT算法提取出一张图片中的所有特征点。
import cv2
img = cv2.imread('test.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp, des = sift.detectAndCompute(gray,None)
- 将要嵌入的字符串转换为二进制形式的数组。
text = 'hello world'
bin_text = ''.join(format(ord(i), '08b') for i in text)
bin_array = [int(i) for i in bin_text]
- 遍历特征点,将二进制数组嵌入到每个特征点的描述子(des)中。
for i in range(len(kp)):
for j in range(len(bin_array)):
des[i][j] += bin_array[j]
- 将修改后的描述子重新组合成特征向量。
new_kp = []
for i in range(len(kp)):
new_kp.append(cv2.KeyPoint(kp[i].pt, kp[i].size, kp[i].angle, kp[i].response, kp[i].octave, des[i]))
- 使用OpenCV库中的drawKeypoints函数将嵌入后的特征点绘制在原图上。
img = cv2.drawKeypoints(img, new_kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
完整代码如下:
import cv2
img = cv2.imread('test.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp, des = sift.detectAndCompute(gray,None)
text = 'hello world'
bin_text = ''.join(format(ord(i), '08b') for i in text)
bin_array = [int(i) for i in bin_text]
for i in range(len(kp)):
for j in range(len(bin_array)):
des[i][j] += bin_array[j]
new_kp = []
for i in range(len(kp)):
new_kp.append(cv2.KeyPoint(kp[i].pt, kp[i].size, kp[i].angle, kp[i].response, kp[i].octave, des[i]))
img = cv2.drawKeypoints(img, new_kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行代码后,将会在原图上绘制出嵌入了字符串的特征点。由于嵌入的字符串较短,因此可能需要放大图片以查看结果
原文地址: https://www.cveoy.top/t/topic/dK5b 著作权归作者所有。请勿转载和采集!