usynlige vannmerker i bilder

stemmer
9

Hvordan setter du usynlige vannmerker i bilder for opphavsrett formål? Jeg leter etter en python bibliotek.

Hva algoritme bruker du? Hva om ytelse og effektivitet?

Publisert på 04/09/2008 klokken 16:15
kilden bruker
På andre språk...                            


11 svar

stemmer
6

Du vil kanskje se inn Steganography; som gjemmer data innsiden av bilder. Det er skjemaer som ikke vil gå tapt hvis du konverterer til en lossier format eller beskjære deler av bildet ut.

Svarte 04/09/2008 kl. 17:18
kilden bruker

stemmer
5

Jeg bruker følgende kode. Det krever PIL:

def reduceOpacity(im, opacity):
    """Returns an image with reduced opacity."""
    assert opacity >= 0 and opacity <= 1
    if im.mode != 'RGBA':
        im = im.convert('RGBA')
    else:
        im = im.copy()
    alpha = im.split()[3]
    alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
    im.putalpha(alpha)
    return im

def watermark(im, mark, position, opacity=1):
    """Adds a watermark to an image."""
    if opacity < 1:
        mark = reduceOpacity(mark, opacity)
    if im.mode != 'RGBA':
        im = im.convert('RGBA')
    # create a transparent layer the size of the image and draw the
    # watermark in that layer.
    layer = Image.new('RGBA', im.size, (0,0,0,0))
    if position == 'tile':
        for y in range(0, im.size[1], mark.size[1]):
            for x in range(0, im.size[0], mark.size[0]):
                layer.paste(mark, (x, y))
    elif position == 'scale':
        # scale, but preserve the aspect ratio
        ratio = min(float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])
        w = int(mark.size[0] * ratio)
        h = int(mark.size[1] * ratio)
        mark = mark.resize((w, h))
        layer.paste(mark, ((im.size[0] - w) / 2, (im.size[1] - h) / 2))
    else:
        layer.paste(mark, position)
    # composite the watermark with the layer
    return Image.composite(layer, im, layer)

img = Image.open('/path/to/image/to/be/watermarked.jpg')

mark1 = Image.open('/path/to/watermark1.png')
mark2 = Image.open('/path/to/watermark2.png')

img = watermark(img, mark1, (img.size[0]-mark1.size[0]-5, img.size[1]-mark1.size[1]-5), 0.5)
img = watermark(img, mark2, 'scale', 0.01)

Vannmerket er for svak til å se. Bare en farge image ville virkelig vise det. Jeg kan bruke den til å skape et bilde som ikke viser et vannmerke, men hvis jeg gjør en bit-for-bit subtraksjon ved hjelp av det opprinnelige bildet, kan jeg vise at min vannmerke er der.

Hvis du ønsker å se hvordan det fungerer, gå til TylerGriffinPhotography.com . Hvert bilde på området er vannmerket to ganger: en gang med vannmerket i det nedre høyre hjørnet på 50% opasitet (5 px fra kanten), og en gang over hele bildet ved 1% dekkevne (med "scale", som skalerer vannmerket hele bildet). Kan du finne ut hva den andre, lav opasitet vannmerke formen er?

Svarte 05/09/2008 kl. 04:32
kilden bruker

stemmer
2

Hvis du snakker om steganography , her er en gammel ikke altfor fancy modul jeg gjorde for en venn en gang (Python 2.x-kode):

koden

from __future__ import division

import math, os, array, random
import itertools as it
import Image as I
import sys

def encode(txtfn, imgfn):
    with open(txtfn, "rb") as ifp:
        txtdata= ifp.read()
    txtdata= txtdata.encode('zip')

    img= I.open(imgfn).convert("RGB")
    pixelcount= img.size[0]*img.size[1]
##  sys.stderr.write("image %dx%d\n" % img.size)

    factor= len(txtdata) / pixelcount
    width= int(math.ceil(img.size[0]*factor**.5))
    height= int(math.ceil(img.size[1]*factor**.5))

    pixelcount= width * height
    if pixelcount < len(txtdata): # just a sanity check
        sys.stderr.write("phase 2, %d bytes in %d pixels?\n" % (len(txtdata), pixelcount))
        sys.exit(1)
##  sys.stderr.write("%d bytes in %d pixels (%dx%d)\n" % (len(txtdata), pixelcount, width, height))
    img= img.resize( (width, height), I.ANTIALIAS)

    txtarr= array.array('B')
    txtarr.fromstring(txtdata)
    txtarr.extend(random.randrange(256) for x in xrange(len(txtdata) - pixelcount))

    newimg= img.copy()
    newimg.putdata([
        (
            r & 0xf8 |(c & 0xe0)>>5,
            g & 0xfc |(c & 0x18)>>3,
            b & 0xf8 |(c & 0x07),
        )
        for (r, g, b), c in it.izip(img.getdata(), txtarr)])
    newimg.save(os.path.splitext(imgfn)[0]+'.png', optimize=1, compression=9)

def decode(imgfn, txtfn):
    img= I.open(imgfn)
    with open(txtfn, 'wb') as ofp:
        arrdata= array.array('B',
            ((r & 0x7) << 5 | (g & 0x3) << 3 | (b & 0x7)
            for r, g, b in img.getdata())).tostring()
        findata= arrdata.decode('zip')
        ofp.write(findata)

if __name__ == "__main__":
    if sys.argv[1] == 'e':
        encode(sys.argv[2], sys.argv[3])
    elif sys.argv[1] == 'd':
        decode(sys.argv[2], sys.argv[3])

algoritmen

Den lagrer en databyte pr bildeelement ved å bruke: 3 de minst signifikante biter i blått bånd, 2 LSB for den grønne og den 3 LSB for den røde.

encode funksjon: En inngangs tekstfil er komprimert ved zlib, og inngangsbildet endrer størrelse (holde mengdeforhold) for å sikre at det er minst like mange piksler som komprimerte byte. En PNG bilde med samme navn som inngangsbildet (så ikke bruk en ".png" filnavn som input hvis du lar koden som den er :) lagres inneholder steganographic data.

dekode funksjon: De tidligere lagrede zlib-komprimerte data er hentet fra inngangsbildet, og lagret ukomprimert under gitt filnavn.

Jeg bekreftet den gamle koden fortsatt kjører, så her er et eksempel bilde som inneholder steganographic data:

inneholder data steganographic

Du vil merke at støyen har lagt er knapt synlig.

Svarte 31/10/2010 kl. 16:03
kilden bruker

stemmer
1

Det er en nyere (2005) digital vannmerking FAQ ved watermarkingworld.org

Svarte 28/03/2009 kl. 04:31
kilden bruker

stemmer
1

Vel, er usynlig vannmerking ikke så lett. Sjekk Digimarc, hva pengene de tjener på det. Det er ingen gratis C / Python-kode som en ensom geni har skrevet en permisjon det gratis bruk. Jeg har implementert min egen algoritme og navnet på verktøyet er SignMyImage. Google det hvis interessert ... F>

Svarte 12/02/2009 kl. 13:16
kilden bruker

stemmer
1

Jeg leter etter "uknuselige" vannmerker, slik at data som er lagret i exif eller bilde metadata er ute.

Jeg har funnet noen interessante ting på nettet mens du venter på svar her: http://www.cosy.sbg.ac.at/~pmeerw/Watermarking/

Det er en masteroppgave som er ganske uttømmende om algoritmer og deres karakteristikker (hva de gjør og hvordan ubrytelig de er). Jeg har ikke fått noen tid til å lese det i dybden, men denne ting ser alvorlig. Det er algoritmer som støtter JPEG-komprimering, beskjæring, gammakorreksjon eller ned skalering på noen måte. Det er C, men jeg kan port den til Python eller bruke C-biblioteker fra Python.

Men det er fra 2001 og jeg tror 7 år er lang tid i dette feltet :( Er det noen som har noe lignende og nyere ting?

Svarte 04/09/2008 kl. 19:06
kilden bruker

stemmer
1

Jeg tror ikke det er et bibliotek som gjør dette ut av boksen. Hvis du ønsker å implementere din egen, ville jeg definitivt gå med Python Imaging Library (PIL).

Dette er en Python Cookbook oppskrift som bruker PIL for å legge til et synlig vannmerke i et bilde. Hvis det er nok for dine behov, kan du bruke dette til å legge til et vannmerke med nok åpenhet som det er bare synlig hvis du vet hva du leter etter.

Svarte 04/09/2008 kl. 16:56
kilden bruker

stemmer
1

Hva om Exif? Det er nok ikke så sikker som hva du tenker, men de fleste brukerne ikke engang vet den finnes, og hvis du gjør det så lett å lese vannmerke informasjonen de som bryr seg vil fortsatt være i stand til å gjøre det likevel.

Svarte 04/09/2008 kl. 16:33
kilden bruker

stemmer
0

Noen bildeformater har overskrifter hvor du kan lagre vilkårlig informasjon i tillegg.
For eksempel, PNG spesifikasjonen har en del hvor du kan lagre tekstdata. Dette ligner på svarene ovenfor, men uten tilsetning av tilfeldige data til selve bildedataene.

Svarte 04/09/2008 kl. 17:59
kilden bruker

stemmer
0

Jeg er ikke sikker på hvor viktig det er å være uknuselig, men en enkel løsning kan bare være å legge til en tekstfil til slutten av bildet. Noe sånt som "Dette bildet tilhører ...".

Hvis du åpner bildet i en viewer / nettleser, ser det ut som en vanlig jpeg, men hvis du åpner den i et tekstredigeringsprogram, ville den siste linjen kunne leses.

Den samme metoden kan du inkludere en faktisk fil til et bilde. ( Skjule en fil inne i et bilde ) Jeg har funnet ut at det er litt hit-or-miss, men 7-zip-filer ser ut til å fungere. Du kan skjule alle slags Copywrite godbiter inne i bildet.

Igjen, det er ikke uknuselig av noen strekning av fantasi, men det er helt usynlig for det blotte øye.

Svarte 04/09/2008 kl. 17:45
kilden bruker

stemmer
0

Jeg hadde tenkt å legge et svar som ligner på Ugh. Jeg vil foreslå å sette en liten TXT-fil som beskriver bildekilde (og kanskje en liten opphavsrett, hvis man gjelder) inn i bildet på en måte som er vanskelig å oppdage og bryte.

Svarte 04/09/2008 kl. 17:20
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more