marcas d'água invisíveis em imagens

votos
9

Como você inserir marcas d'água invisíveis em imagens para fins de direitos autorais? Eu estou procurando uma biblioteca python.

O algoritmo que você usa? E quanto a desempenho e eficiência?

Publicado 04/09/2008 em 17:15
fonte usuário
Em outras línguas...                            


11 respostas

votos
6

Você pode querer olhar para esteganografia; que está escondido dentro de dados de imagens. Existem formas que não vai se perder se você converter para um formato Lossier ou até mesmo partes da colheita da imagem para fora.

Respondeu 04/09/2008 em 18:18
fonte usuário

votos
5

Eu uso o seguinte código. Ela exige 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)

A marca d'água é muito fraco para ver. Apenas uma imagem de cor sólida seria realmente mostrar isso. Posso usá-lo para criar uma imagem que não mostra uma marca d'água, mas se eu fizer uma subtração bit-por-bit usando a imagem original, eu posso demonstrar que a minha marca d'água é lá.

Se você quiser ver como ele funciona, vá para TylerGriffinPhotography.com . Cada imagem no site é marca de água duas vezes: uma vez com a marca de água no canto inferior direito em 50% de opacidade (5px a partir do bordo), e uma vez ao longo de toda a imagem em 1% de opacidade (usando "escala", que escalona a marca de água para toda a imagem). Você pode descobrir o que a segunda forma de marca d'água, baixa opacidade é?

Respondeu 05/09/2008 em 05:32
fonte usuário

votos
2

Se você está falando de esteganografia , aqui está um velho módulo não demasiado extravagante eu fiz para um amigo uma vez (código Python 2.x):

o código

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])

o algoritmo

Ele armazena um byte de dados por pixel de imagem usando: os 3 bits menos significativos da faixa azul, a 2 LSB da uma verde e 3 LSB do vermelho.

função de codificar: Um arquivo de texto de entrada é comprimido por zlib, e a imagem de entrada é redimensionada (mantendo proporções) para garantir que há pelo menos mais pixels que bytes compactados. A PNG imagem com o mesmo nome que a imagem de entrada (portanto, não use um nome de arquivo ".png" como entrada, se você deixar o código como está :) é salvo contendo os dados steganographic.

função de descodificação: Os dados comprimidos-zlib previamente armazenados são extraídos a partir da imagem de entrada, e guardada sem compressão sob o nome do ficheiro fornecido.

Verifiquei o código antigo ainda funciona, então aqui está uma imagem exemplo contendo dados steganographic:

contém dados esteganográfico

Você vai notar que o ruído adicional é pouco visível.

Respondeu 31/10/2010 em 17:03
fonte usuário

votos
1

Há um mais recente (2005) watermarking FAQ digital em watermarkingworld.org

Respondeu 28/03/2009 em 05:31
fonte usuário

votos
1

Bem, marca d'água invisível que não é fácil. Verifique Digimarc, o que o dinheiro que eles ganham sobre ele. Não há nenhum código livre C / Python que um gênio solitário tem escrito uma deixá-la para uso gratuito. Eu tenho implementado o meu próprio algoritmo e o nome da ferramenta é SignMyImage. Google-lo se estiver interessado ... F>

Respondeu 12/02/2009 em 14:16
fonte usuário

votos
1

Estou à procura de marcas d'água "inquebrável", de modo que os dados armazenados no exif ou metadados de imagem estão fora.

Eu descobri algumas coisas interessantes na web enquanto aguarda respostas aqui: http://www.cosy.sbg.ac.at/~pmeerw/Watermarking/

Há uma tese de mestrado que é bastante exaustiva sobre algoritmos e suas caracteristicas (o que eles fazem e como eles são inquebráveis). Eu não tenho nenhum tempo para lê-lo em profundidade, mas este material parece sério. Existem algoritmos que suportam compressão JPEG, recorte, correção gamma ou para baixo dimensionamento de alguma forma. É C, mas eu posso transportá-lo para Python ou usar bibliotecas C do Python.

No entanto, é de 2001 e eu acho que 7 anos são muito tempo neste campo :( Alguém tem alguma coisa semelhante e mais recente?

Respondeu 04/09/2008 em 20:06
fonte usuário

votos
1

Eu não acho que há uma biblioteca que faz isso fora da caixa. Se você quiser implementar sua própria, eu definitivamente ir com o Python Imaging Library (PIL).

Esta é uma receita Python Cookbook que usa PIL para adicionar uma visível marca d'água a uma imagem. Se é suficiente para suas necessidades, você pode usar isso para adicionar uma marca d'água com transparência suficiente para que ele só é visível se você sabe o que você está procurando.

Respondeu 04/09/2008 em 17:56
fonte usuário

votos
1

E sobre Exif? Provavelmente não é tão seguro quanto o que você está pensando, mas a maioria dos usuários nem sequer sabem que ela existe e se você torná-lo tão fácil de ler as informações de marca d'água aqueles que se preocupam ainda será capaz de fazê-lo de qualquer maneira.

Respondeu 04/09/2008 em 17:33
fonte usuário

votos
0

Alguns formatos de imagem têm cabeçalhos onde você pode armazenar informações arbitrárias também.
Por exemplo, a especificação PNG tem um pedaço onde você pode armazenar dados de texto. Isto é semelhante ao das respostas acima, mas sem a adição de dados aleatórios para os próprios dados de imagem.

Respondeu 04/09/2008 em 18:59
fonte usuário

votos
0

Eu não tenho certeza o quão importante é para ser inquebrável, mas uma solução simples pode ser apenas para anexar um arquivo de texto para o fim da imagem. Algo como "Esta imagem pertence a ...".

Se você abrir a imagem em um visualizador / navegador, ele se parece com um jpeg normal, mas se você abri-lo em um editor de texto, a última linha seria legível.

O mesmo método permite que você incluir um arquivo real em uma imagem. ( Esconder um arquivo dentro de uma imagem ) eu descobri que ele é um pouco sucesso ou perder, mas os arquivos 7-zip parecem funcionar. Você pode ocultar todos os tipos de guloseimas Copywrite dentro da imagem.

Novamente, não é inquebrável por qualquer trecho da imaginação, mas é completamente invisível a olho nu.

Respondeu 04/09/2008 em 18:45
fonte usuário

votos
0

Eu estava indo para postar uma resposta semelhante à Ugh. Gostaria de sugerir colocar um pequeno arquivo TXT descrevendo a fonte da imagem (e talvez um comunicado pequena copyright, se aplicável) para a imagem de uma forma que é difícil de detectar e quebrar.

Respondeu 04/09/2008 em 18:20
fonte usuário

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