comparar imagens "matching" Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Lazyyy
Posts: 55
Joined: 27 Jan 2020, 21:56

comparar imagens "matching"

13 Oct 2021, 06:25

Bom dia à todos. Andei pesquisando pelo fórum, algo sobre comparação de imagens; descobrir quantos por cento uma imagem é semelhante à outra e realizar um comando à partir disto.
O que consegui encontrar foi um código escrito por um usuário do fórum arquivado, este código mostra a diferença de pixels entre 2 imagens, porém o código em si não compara a semelhança das imagens sem considerar suas proporções, por este motivo, o código não serve para comparar semelhanças. Navegando, pude encontrar uma biblioteca chamada "GDIP Imagesearch", criada por um usuário de AHK, porém, a última atualização foi há 4 anos e acredito que o script não funcione mais. Notei que muitas pessoas procuravam algo deste tipo mas não obtiveram respostas, antes de chegar a conclusão de que não seria possível fazer um código assim em AHK, vim até aqui para tentar ser o mais específico possível, para conseguir algo parecido ou quem sabe, aprender novas formas de se utilizar PixelSearch e ImageSearch.


Primeiramente, as imagens que gostaria de comparar: https://prnt.sc/1vz03b2

Dá para notar que as imagens são as mesmas, porém, de tamanhos diferentes, sendo assim, ImageSearch não conseguiria encontrar todas, a não ser que fosse adicionado um comando de ImageSearch para cada imagem na tela:

Code: Select all

ImageSearch, imgx, imgy, 0, 0, 1280, 720, %A_WorkingDir%/start1.png
If (ErrorLevel = 0) {
	MsgBox, Imagem 1 encontrada!
}
ImageSearch, imgx, imgy, 0, 0, 1280, 720, %A_WorkingDir%/start2.png
If (ErrorLevel = 0) {
	MsgBox, Imagem 2 encontrada!
}
ImageSearch, imgx, imgy, 0, 0, 1280, 720, %A_WorkingDir%/start3.png
If (ErrorLevel = 0) {
	MsgBox, Imagem 3 encontrada!
}
O que daria um pouco de trabalho dependendo de quantas imagens um script irá analisar.

Gostaria de saber se há algum jeito de comparar semelhanças entre imagens levando em consideração apenas a sua aparência, seja criando uma biblioteca de imagens ou até mesmo utilizando outras linguagens junto ao AHK

Código que mostra a diferença entre imagens:
Spoiler
User avatar
Gio
Posts: 1248
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: comparar imagens "matching"  Topic is solved

14 Oct 2021, 10:00

Bom dia Lazyyy.

Então, isso que você comentou me parece muito próximo do conceito de um hash perceptivo (perceptual hashing). Basicamente a ideia é comparar hashes de imagens e identificar quais imagens são visualmente semelhantes (ou definir um "grau de semelhança visual" entre elas).

Algoritmos desse tipo já existem, mas são algo do tipo "em melhoria contínua". O próprio Google utiliza algoritmos desse tipo no seu buscador de imagens (tanto que clicando no ícone de câmera você pode fazer upload de uma imagem e procurar imagens semelhantes na internet). O Youtube também usa esse tipo de algoritmo para tentar identificar plágio de videos.

Mas enfim... um algoritmo "completo" desses para comparar "quaisquer imagens" é algo extremamente complexo de se descrever ou fazer, e não possui ainda uma acurácia absoluta (embora alguns sejam bastante poderosos).

Mesmo assim, no caso da imagem que você anexou, o que você pode fazer de forma mais fácil é criar uma algoritmo para AQUELA imagem. Isso seria feito observando quais pixels da imagem se repetem em todos os tamanhos e depois criando uma série de PixelSearchs com tolerâncias configuradas em ajuste fino e que possam detectar o padrão de cores daquela imagem. Isso seria bem mais fácil de fazer.

Agora se você quiser mesmo utilizar um algoritmo para comparar QUAISQUER imagens, sugiro que busque uma biblioteca em DLL ou API online existente que permita o acesso de dentro do script (usando dllcall() ou HttpQuery() por exemplo). Em uma rápida busca encontrei esta, mas não tenho tempo de entender como acessá-la agora.

exemplo phash.png
exemplo phash.png (127.03 KiB) Viewed 1503 times

Do contrário, se quiser escrever um algoritmo novo totalmente em AutoHotkey (o que seria bastante trabalhoso, mas pode ser feito), creio que o passo-a-passo de um script do tipo seria tipo esse:

1. Selecionar a imagem 1
2. Selecionar a imagem 2 ou capturar a tela e transformar na imagem 2.
3. Acessar os códigos binários dos pixels da imagem 1 (através do layout do arquivo você poderia isolar essa informação).
4. criar um hash perceptivo da imagem 1 (seria algo como "encontrar um subconjunto de dados que defina bem aquela imagem". Em um brainstorm, eu diria que podem ser tentando posiçõe-chave, quantidade e/ou localização proporcional de transições de cores, cor média, etc). Esse passo aqui é a parte "pesada" do script, e teria muita tentativa e erro.
5. Fazer a mesma coisa com a imagem 2.
6. Comparar o grau de semelhança entre os hashes (imagens semelhantes teriam hashes semelhantes).


Alguns estudos acadêmicos que podem te ajudar:

http://tede.bibliotecadigital.puc-campinas.edu.br:8080/jspui/bitstream/tede/1255/2/ANDERSON%20DOS%20SANTOS%20SILVA%20TORRES.pdf
Lazyyy
Posts: 55
Joined: 27 Jan 2020, 21:56

Re: comparar imagens "matching"

14 Oct 2021, 13:09

Gio wrote:
14 Oct 2021, 10:00
Bom dia Lazyyy.

Então, isso que você comentou me parece muito próximo do conceito de um hash perceptivo (perceptual hashing). Basicamente a ideia é comparar hashes de imagens e identificar quais imagens são visualmente semelhantes (ou definir um "grau de semelhança visual" entre elas).

Algoritmos desse tipo já existem, mas são algo do tipo "em melhoria contínua". O próprio Google utiliza algoritmos desse tipo no seu buscador de imagens (tanto que clicando no ícone de câmera você pode fazer upload de uma imagem e procurar imagens semelhantes na internet). O Youtube também usa esse tipo de algoritmo para tentar identificar plágio de videos.

Mas enfim... um algoritmo "completo" desses para comparar "quaisquer imagens" é algo extremamente complexo de se descrever ou fazer, e não possui ainda uma acurácia absoluta (embora alguns sejam bastante poderosos).

Mesmo assim, no caso da imagem que você anexou, o que você pode fazer de forma mais fácil é criar uma algoritmo para AQUELA imagem. Isso seria feito observando quais pixels da imagem se repetem em todos os tamanhos e depois criando uma série de PixelSearchs com tolerâncias configuradas em ajuste fino e que possam detectar o padrão de cores daquela imagem. Isso seria bem mais fácil de fazer.

Agora se você quiser mesmo utilizar um algoritmo para comparar QUAISQUER imagens, sugiro que busque uma biblioteca em DLL ou API online existente que permita o acesso de dentro do script (usando dllcall() ou HttpQuery() por exemplo). Em uma rápida busca encontrei esta, mas não tenho tempo de entender como acessá-la agora.


exemplo phash.png


Do contrário, se quiser escrever um algoritmo novo totalmente em AutoHotkey (o que seria bastante trabalhoso, mas pode ser feito), creio que o passo-a-passo de um script do tipo seria tipo esse:

1. Selecionar a imagem 1
2. Selecionar a imagem 2 ou capturar a tela e transformar na imagem 2.
3. Acessar os códigos binários dos pixels da imagem 1 (através do layout do arquivo você poderia isolar essa informação).
4. criar um hash perceptivo da imagem 1 (seria algo como "encontrar um subconjunto de dados que defina bem aquela imagem". Em um brainstorm, eu diria que podem ser tentando posiçõe-chave, quantidade e/ou localização proporcional de transições de cores, cor média, etc). Esse passo aqui é a parte "pesada" do script, e teria muita tentativa e erro.
5. Fazer a mesma coisa com a imagem 2.
6. Comparar o grau de semelhança entre os hashes (imagens semelhantes teriam hashes semelhantes).


Alguns estudos acadêmicos que podem te ajudar:

http://tede.bibliotecadigital.puc-campinas.edu.br:8080/jspui/bitstream/tede/1255/2/ANDERSON%20DOS%20SANTOS%20SILVA%20TORRES.pdf
O pHash é incrível, ele me serviu muito bem para identificar similaridades entre duas imagens, talvez, à partir de apps como este, seja possível fazer scripts mais complexos, usando-os como complemento para funções inexistentes ou muito difíceis de se fazer em AHK

Obrigado pela atenção @Gio

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 9 guests