ShieldMnt / invisible-watermark

python library for invisible image watermark (blind image watermark)
MIT License
1.53k stars 138 forks source link

WatermarkDecoder returns 'test' #37

Closed Ashh-Z closed 2 days ago

Ashh-Z commented 3 weeks ago

I watermarked the image using dwtDctSvd. When using the WatermarkDecoder on this image, the output is 'test.' I also tried saving the watermarked image in .jpg and .png formats, but the output remains the same. I tried using watermark.decode('utf-8','replace'), but the result is same. Additionally, I tested if the initial image can be watermarked using the code given here (https://github.com/ShieldMnt/invisible-watermark/issues/30#issuecomment-1928054451). This returns true for my image.

Is this expected for the WatermarkDecoder? If yes, what does this mean?

## ENCODING

import cv2
from imwatermark import WatermarkEncoder

bgr = cv2.imread('Image_2024.jpg')
wm = 'test'

encoder = WatermarkEncoder()
encoder.set_watermark('bytes', wm.encode('utf-8'))
bgr_encoded = encoder.encode(bgr, 'dwtDctSvd')

cv2.imwrite('test_wm.jpg', bgr_encoded)

## DECODING

import cv2
from imwatermark import WatermarkDecoder

bgr = cv2.imread('test_wm.jpg')

decoder = WatermarkDecoder('bytes', 32)
watermark = decoder.decode(bgr, 'dwtDctSvd')
print(watermark.decode('utf-8',))

import cv2
from imwatermark import WatermarkDecoder

bgr = cv2.imread('test_wm.png')

decoder = WatermarkDecoder('bytes', 32)
watermark = decoder.decode(bgr, 'dwtDctSvd')
print(watermark.decode('utf-8',))

watermark.decode('utf-8','replace')
michelpf commented 1 week ago

Using a decode of 32 bytes can only encode 4 characters.

Ashh-Z commented 1 week ago

Using a decode of 32 bytes can only encode 4 characters.

Sorry but I don't get it. So is this working as expected ?

michelpf commented 1 week ago

If you try to encode more than 4 characters you can get some weird results. Try with 4, it should work as expected.