当前位置:网站首页>[200 opencv routines] 219 Add digital watermark (blind watermark)

[200 opencv routines] 219 Add digital watermark (blind watermark)

2022-07-05 09:50:00 Xiaobai youcans

OpenCV routine 200 piece General catalogue


【youcans Of OpenCV routine 200 piece 】219. Add a digital watermark ( Blind watermarking )

8.2 Add digital blind watermark

Digital watermark , It refers to embedding feature information into audio 、 In digital signals such as images or videos .

Digital watermarking is divided into clear watermarking and blind watermarking (blind watermark). The information contained in the watermark can be seen when watching an image or video . Blind watermarking is embedded in the image in the form of digital data , You can't see it under normal conditions , Watermark information can only be extracted after special processing . Blind watermark is also called hidden watermark , Information hiding can be realized 、 Copyright certification 、 Identity Authentication 、 Digital signature and other functions .

Least significant bit (Least significant bit) Blind watermarking , It is the most simple and convenient method to realize blind watermarking . The principle of this method is to save the digital watermark information as a binary image , Embedded into the lowest bit of the original image , Replace the least significant bit of the original image with the watermark image .

With 8 For example, a bit gray image , Pixels in the original image P The gray value of is determined by 8 Bit binary number ( p 7 , p 6 , . . . , p 1 , p 0 ) (p_7, p_6,...,p_1,p_0) (p7,p6,...,p1,p0) Express , The pixel value of the pixel in the binary watermark image is determined by 1 Bit binary number b 0 b_0 b0 Express . Use the pixel value of the watermark image b 0 b_0 b0 Replace the least significant bit of the original image p 0 p_0 p0, Get the embedded watermark 8 Bit binary number ( p 7 , p 6 , . . . , p 1 , b 0 ) (p_7, p_6,...,p_1,b_0) (p7,p6,...,p1,b0).

The process of extracting blind watermark is opposite to embedding watermark , From the original image embedded with watermark 8 Bit binary number ( p 7 , p 6 , . . . , p 1 , b 0 ) (p_7, p_6,...,p_1,b_0) (p7,p6,...,p1,b0) in , Separate least significant bits b 0 b_0 b0 Generate watermark image .

The process of extracting blind watermark , For the original image embedded with watermark , take 8 Bit binary number ( p 7 , p 6 , . . . , p 1 , b 0 ) (p_7, p_6,...,p_1,b_0) (p7,p6,...,p1,b0) The least significant position of zero .


routine A4.11: Add digital blind watermark to gray image

    # A4.10  Embed digital blind watermark in gray image 
    img = cv.imread("../images/imgLena.tif", 0)  #  Load the original image , single channel 
    watermark = cv.imread("../images/logoCV.png", 0)  # #  Load watermark image , single channel 
    markResize = cv.resize(watermark, img.shape[:2])  #  Adjust the picture size and  img  Same size 
    _, binary = cv.threshold(markResize, 175, 1, cv.THRESH_BINARY)  # 0/1  Binary image 

    #  Embed watermark into the original image 
    # img (g7,g6,...g1,0) AND 254(11111110) -> imgH7: (g7,g6,...g1,0)
    imgH7 = cv.bitwise_and(img, 254)  #  Bitwise and operation , Image lowest order  LSB=0
    # imgH7: (g7,g6,...g1,0) OR b -> imgMark: (g7,g6,...g1,b)
    imgMark = cv.bitwise_or(imgH7, binary)  # (g7,g6,...g1,b)

    #  Extract the watermark from the embedded watermark image 
    # extract = np.mod(imgMark, 2) #  Modular arithmetic , Take the lowest bit of the image  LSB
    extract = cv.bitwise_and(imgMark, 1)  #  Bitwise and operation , Take the lowest bit of the image  LSB

    plt.figure(figsize=(9, 6))
    plt.subplot(221), plt.title("original gray"), plt.axis('off')
    plt.imshow(img, cmap='gray')
    plt.subplot(222), plt.title("watermark"), plt.axis('off')
    plt.imshow(binary, cmap='gray')
    plt.subplot(223), plt.title("embedding watermark"), plt.axis('off')
    plt.imshow(imgMark, cmap='gray')
    plt.subplot(224), plt.title("extracted watermark"), plt.axis('off')
    plt.imshow(extract, cmap='gray')
    plt.tight_layout()
    plt.show()

 Insert picture description here


routine A4.12: Embed digital blind watermarking with different contents in each channel of color image

Separate the channels of the color image , Digital watermarking with the same content can be embedded , Digital watermarks of different contents can also be embedded .

    # A4.12  Embed digital blind watermarking with different contents in each channel of color image 
    img = cv.imread("../images/imgLena.tif", 1)  #  Load the original image , single channel 

    #  Load or generate watermark information 
    watermark = cv.imread("../images/logoCV.png", 0)  # #  Load watermark image , single channel 
    markResize = cv.resize(watermark, img.shape[:2])  #  Adjust the picture size and  img  Same size 
    _, binary = cv.threshold(markResize, 175, 1, cv.THRESH_BINARY)  # 0/1  Binary image 

    mark1 = np.ones(img.shape[:2], np.uint8)
    cv.putText(mark1, str(np.datetime64('today')), (50, 100), cv.FONT_HERSHEY_SIMPLEX, 2, 0, 2)
    cv.putText(mark1, str(np.datetime64('now')), (50, 150), cv.FONT_HERSHEY_DUPLEX, 1, 0)

    mark2 = np.ones(img.shape[:2], np.uint8)
    cv.putText(mark2, "200 examples for OpenCV", (50, 300), cv.FONT_HERSHEY_SIMPLEX, 2, 0, 2)
    cv.putText(mark2, "[email protected], 2022", (50, 350), cv.FONT_HERSHEY_DUPLEX, 1, 0)

    #  Embed watermark into the original image 
    # img: (g7,g6,...g1,0) -> imgH7: (g7,g6,...g1,0)
    imgH7 = (img >> 1) << 1  #  Move right -> Move left , Image lowest order  LSB=0
    # imgH7: (g7,g6,...g1,0) OR b -> imgMark: (g7,g6,...g1,b)
    #  Insert digital watermark into each channel respectively  binary,mark1,mark2
    b = cv.bitwise_or(imgH7[:, :, 0], binary)  # (g7,g6,...g1,b)
    g = cv.bitwise_or(imgH7[:, :, 1], mark1)  # (g7,g6,...g1,m1)
    r = cv.bitwise_or(imgH7[:, :, 2], mark2)  # (g7,g6,...g1,m2)
    imgMark = cv.merge([b, g, r])

    # #  Extract the watermark from the embedded watermark image 
    b, g, r = cv.split(imgMark)  #  Split into  BGR  Independent channel 
    bMark = cv.bitwise_and(b, 1)  #  Bitwise and operation , take  B  The lowest bit of the channel  LSB
    gMark = cv.bitwise_and(g, 1)  #  Bitwise and operation , take  G  The lowest bit of the channel  LSB
    rMark = cv.bitwise_and(r, 1)  #  Bitwise and operation , take  R  The lowest bit of the channel  LSB

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.title("original gray"), plt.axis('off')
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(232), plt.title("watermark"), plt.axis('off')
    plt.imshow(binary, cmap='gray')
    plt.subplot(233), plt.title("embedding watermark"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgMark, cv.COLOR_BGR2RGB))
    plt.subplot(234), plt.title("watermark ch-B"), plt.axis('off')
    plt.imshow(bMark, cmap='gray')
    plt.subplot(235), plt.title("watermark ch-G"), plt.axis('off')
    plt.imshow(gMark, cmap='gray')
    plt.subplot(236), plt.title("watermark ch-R"), plt.axis('off')
    plt.imshow(mark2, cmap='gray')
    plt.show()

 Insert picture description here


【 At the end of this section 】

Copyright notice :
[email protected] Original works , Reprint must be marked with the original link :(https://blog.csdn.net/youcans/article/details/125506913)
Copyright 2022 youcans, XUPT
Crated:2022-6-28
Welcome to your attention 『youcans Of OpenCV routine 200 piece 』 series , Ongoing update
Welcome to your attention 『youcans Of OpenCV Learning lessons 』 series , Ongoing update

210. There are so many holes in drawing a straight line ?
211. Draw vertical rectangle
212. Draw a slanted rectangle
213. Draw a circle
214. Detailed explanation of parameters for drawing ellipse
215. Draw approximate ellipses based on polylines
216. Draw polylines and polygons
217. Mouse interaction to obtain polygon area
218. Multi line oblique text watermark
219. Add digital blind watermark

原网站

版权声明
本文为[Xiaobai youcans]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050934228247.html