Skip to content

Commit

Permalink
更新抵抗形变攻击
Browse files Browse the repository at this point in the history
  • Loading branch information
fire-keeper committed Aug 2, 2019
1 parent ed5885d commit 6ef1ad7
Show file tree
Hide file tree
Showing 13 changed files with 387 additions and 30 deletions.
2 changes: 2 additions & 0 deletions BlindWatermark/BlindWatermark.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,8 @@ def extract(self,filename,out_wm_name):
cv2.imwrite(out_wm_name,extract_wm.reshape(64,64))

path,file_name = os.path.split(out_wm_name)
if not os.path.isdir(os.path.join(path,'Y_U_V')):
os.mkdir(os.path.join(path,'Y_U_V'))
cv2.imwrite(os.path.join(path,'Y_U_V','Y'+file_name),extract_wm_Y.reshape(64,64))
cv2.imwrite(os.path.join(path,'Y_U_V','U'+file_name),extract_wm_U.reshape(64,64))
cv2.imwrite(os.path.join(path,'Y_U_V','V'+file_name),extract_wm_V.reshape(64,64))
Expand Down
44 changes: 44 additions & 0 deletions BlindWatermark/tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import cv2
import numpy as np



def recovery(ori_img,attacked_img,outfile_name = './recoveried.png',rate=0.7):
img = cv2.imread(ori_img)
img2 = cv2.imread(attacked_img)

height = img.shape[0]
width = img.shape[1]
# Initiate SIFT detector
orb = cv2.ORB_create(128)
MIN_MATCH_COUNT=10
# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img,None)
kp2, des2 = orb.detectAndCompute(img2,None)

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)

flann = cv2.FlannBasedMatcher(index_params, search_params)



des1 = np.float32(des1)
des2 = np.float32(des2)

matches = flann.knnMatch(des1,des2,k=2)

# store all the good matches as per Lowe's ratio test.
good = []
for m,n in matches:
if m.distance < rate*n.distance:
good.append(m)

if len(good)>MIN_MATCH_COUNT:
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
M, mask = cv2.findHomography( dst_pts,src_pts, cv2.RANSAC,5.0)
out = cv2.warpPerspective(img2, M, (width,height)) #先列后行
cv2.imwrite(outfile_name,out)

2 changes: 2 additions & 0 deletions GUI/BlindWatermark/BlindWatermark.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,8 @@ def extract(self,filename,out_wm_name):
cv2.imwrite(out_wm_name,extract_wm.reshape(64,64))

path,file_name = os.path.split(out_wm_name)
if not os.path.isdir(os.path.join(path,'Y_U_V')):
os.mkdir(os.path.join(path,'Y_U_V'))
cv2.imwrite(os.path.join(path,'Y_U_V','Y'+file_name),extract_wm_Y.reshape(64,64))
cv2.imwrite(os.path.join(path,'Y_U_V','U'+file_name),extract_wm_U.reshape(64,64))
cv2.imwrite(os.path.join(path,'Y_U_V','V'+file_name),extract_wm_V.reshape(64,64))
Expand Down
3 changes: 2 additions & 1 deletion GUI/BlindWatermark/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .BlindWatermark import watermark
from .ncc import NCC
from .ncc import average_ncc
from .psnr import average_psnr
from .psnr import average_psnr
from .tools import recovery
Binary file modified GUI/BlindWatermark/__pycache__/BlindWatermark.cpython-36.pyc
Binary file not shown.
Binary file modified GUI/BlindWatermark/__pycache__/__init__.cpython-36.pyc
Binary file not shown.
Binary file not shown.
57 changes: 57 additions & 0 deletions GUI/BlindWatermark/tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import cv2
import numpy as np
from PyQt5.QtCore import pyqtSignal, QThread



class recovery(QThread):
num_of_good=pyqtSignal(int,str)
def __init__(self,ori_img,attacked_img,outfile_name = './recoveried.png',rate=0.7):
QThread.__init__(self)
self.ori_img = ori_img
self.attacked_img = attacked_img
self.outfile_name = outfile_name
self.rate = rate

def run(self):
img = cv2.imread(self.ori_img)
img2 = cv2.imread(self.attacked_img)

height = img.shape[0]
width = img.shape[1]
# Initiate SIFT detector
orb = cv2.ORB_create(128)
MIN_MATCH_COUNT=10
# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img,None)
kp2, des2 = orb.detectAndCompute(img2,None)

FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)

flann = cv2.FlannBasedMatcher(index_params, search_params)



des1 = np.float32(des1)
des2 = np.float32(des2)

matches = flann.knnMatch(des1,des2,k=2)

# store all the good matches as per Lowe's ratio test.
good = []
for m,n in matches:
if m.distance < self.rate*n.distance:
good.append(m)

if len(good)>MIN_MATCH_COUNT:
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
M, mask = cv2.findHomography( dst_pts,src_pts, cv2.RANSAC,5.0)
out = cv2.warpPerspective(img2, M, (width,height)) #先列后行
cv2.imwrite(self.outfile_name,out)
self.num_of_good.emit(len(good),self.outfile_name)
else :
self.num_of_good.emit(0,'')

58 changes: 56 additions & 2 deletions GUI/Ui_main_win.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ def setupUi(self, MainWindow):
self.pushButton_4 = QtWidgets.QPushButton(self.frame_5)
self.pushButton_4.setObjectName("pushButton_4")
self.gridLayout_5.addWidget(self.pushButton_4, 0, 1, 1, 1)
self.pushButton_11 = QtWidgets.QPushButton(self.frame_5)
self.pushButton_11.setObjectName("pushButton_11")
self.gridLayout_5.addWidget(self.pushButton_11, 1, 1, 1, 1)
self.gridLayout_4.addWidget(self.frame_5, 12, 1, 1, 1)
self.frame_6 = QtWidgets.QFrame(self.tab)
self.frame_6.setFrameShape(QtWidgets.QFrame.StyledPanel)
Expand Down Expand Up @@ -218,6 +221,46 @@ def setupUi(self, MainWindow):
self.line_5.setObjectName("line_5")
self.gridLayout_4.addWidget(self.line_5, 8, 1, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_4 = QtWidgets.QWidget()
self.tab_4.setObjectName("tab_4")
self.frame_7 = QtWidgets.QFrame(self.tab_4)
self.frame_7.setGeometry(QtCore.QRect(0, 0, 280, 201))
self.frame_7.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_7.setFrameShadow(QtWidgets.QFrame.Sunken)
self.frame_7.setObjectName("frame_7")
self.gridLayout_8 = QtWidgets.QGridLayout(self.frame_7)
self.gridLayout_8.setObjectName("gridLayout_8")
self.textBrowser_2 = QtWidgets.QTextBrowser(self.frame_7)
self.textBrowser_2.setObjectName("textBrowser_2")
self.gridLayout_8.addWidget(self.textBrowser_2, 0, 0, 1, 2)
self.pushButton_8 = QtWidgets.QPushButton(self.frame_7)
self.pushButton_8.setObjectName("pushButton_8")
self.gridLayout_8.addWidget(self.pushButton_8, 1, 0, 1, 1)
self.pushButton_10 = QtWidgets.QPushButton(self.frame_7)
self.pushButton_10.setObjectName("pushButton_10")
self.gridLayout_8.addWidget(self.pushButton_10, 2, 0, 1, 1)
self.pushButton_9 = QtWidgets.QPushButton(self.frame_7)
self.pushButton_9.setObjectName("pushButton_9")
self.gridLayout_8.addWidget(self.pushButton_9, 1, 1, 1, 1)
self.frame_8 = QtWidgets.QFrame(self.frame_7)
self.frame_8.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_8.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_8.setObjectName("frame_8")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_8)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label_12 = QtWidgets.QLabel(self.frame_8)
self.label_12.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.label_12.setObjectName("label_12")
self.horizontalLayout.addWidget(self.label_12)
self.doubleSpinBox_3 = QtWidgets.QDoubleSpinBox(self.frame_8)
self.doubleSpinBox_3.setMaximum(1.0)
self.doubleSpinBox_3.setSingleStep(0.1)
self.doubleSpinBox_3.setProperty("value", 0.7)
self.doubleSpinBox_3.setObjectName("doubleSpinBox_3")
self.horizontalLayout.addWidget(self.doubleSpinBox_3)
self.gridLayout_8.addWidget(self.frame_8, 2, 1, 1, 1)
self.tabWidget.addTab(self.tab_4, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.label_8 = QtWidgets.QLabel(self.tab_2)
Expand Down Expand Up @@ -309,6 +352,7 @@ def retranslateUi(self, MainWindow):
self.pushButton_3.setText(_translate("MainWindow", "嵌入"))
self.pushButton_4.setStatusTip(_translate("MainWindow", "在设置工作目录的前提下, 将原图和水印图复制到工作目录下"))
self.pushButton_4.setText(_translate("MainWindow", "将图片复制到工作目录"))
self.pushButton_11.setText(_translate("MainWindow", "打开工作目录"))
self.pushButton_5.setToolTip(_translate("MainWindow", "设置工作目录后,会在嵌入时在工作目录写入密钥: key.json"))
self.pushButton_5.setText(_translate("MainWindow", "设置工作目录"))
self.pushButton_6.setText(_translate("MainWindow", "从剪切板导入密钥"))
Expand All @@ -319,8 +363,19 @@ def retranslateUi(self, MainWindow):
self.label_3.setText(_translate("MainWindow", "小波变换级数"))
self.checkBox.setText(_translate("MainWindow", "限制相同"))
self.label_7.setText(_translate("MainWindow", "水印形状"))

self.label_6.setText(_translate("MainWindow", "分块形状"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "盲水印"))
self.textBrowser_2.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:11pt;\">恢复形变攻击</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">将经过平移,旋转,缩放,透视等形变的图片恢复成接近原图,是从受到形变攻击的图片中提取水印的必要前置步骤</p></body></html>"))
self.pushButton_8.setText(_translate("MainWindow", "读取原图"))
self.pushButton_10.setText(_translate("MainWindow", "恢复"))
self.pushButton_9.setText(_translate("MainWindow", "读取受到攻击的图片"))
self.label_12.setText(_translate("MainWindow", "阈值:"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("MainWindow", "工具"))
self.label_8.setText(_translate("MainWindow", "咕咕咕"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "盲水印抗破坏验证"))
self.label_9.setText(_translate("MainWindow", "捐赠通道"))
Expand All @@ -347,7 +402,6 @@ def retranslateUi(self, MainWindow):
self.help.setText(_translate("MainWindow", "帮助"))
self.support.setText(_translate("MainWindow", "支持"))
self.support.setToolTip(_translate("MainWindow", "恰饭"))
self.label_6.setText(_translate("MainWindow", "分块形状"))


from img import sources_rc
Expand Down
1 change: 0 additions & 1 deletion GUI/key.json

This file was deleted.

Loading

0 comments on commit 6ef1ad7

Please sign in to comment.