由于SIFT算法主要用于图像特征点的提取和匹配,不适合直接嵌入字符串。因此,我们可以借助SIFT算法提取出的特征点进行嵌入。

具体实现过程如下:

  1. 使用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)
  1. 将要嵌入的字符串转换为二进制形式的数组。
text = 'hello world'
bin_text = ''.join(format(ord(i), '08b') for i in text)
bin_array = [int(i) for i in bin_text]
  1. 遍历特征点,将二进制数组嵌入到每个特征点的描述子(des)中。
for i in range(len(kp)):
    for j in range(len(bin_array)):
        des[i][j] += bin_array[j]
  1. 将修改后的描述子重新组合成特征向量。
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]))
  1. 使用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()

运行代码后,将会在原图上绘制出嵌入了字符串的特征点。由于嵌入的字符串较短,因此可能需要放大图片以查看结果

利用sift算法在图片特征点中嵌入字符串用Python写一个示例

原文地址: https://www.cveoy.top/t/topic/dK5b 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录