Jump to content
Leudassdf

Alterando cor da imagem

Recommended Posts

Leudassdf

Boas pessoal.

Gostaria de saber se e possivel alterar a cor de uma imagem. por exemplo eu pego numa imagem a cores e quero converte-la para preto e branco. É possivel?

Uma duvida se depois eu quiser comparar essa imagem mas o brilho do monitor for diferente a imagem ja vai ser diferente certo? Sera melhor comparar a imagem atraves do RGB?

Cumprimentos

Edited by Leudassdf

Share this post


Link to post
Share on other sites
Leudassdf

Resolvido.

Gostaria apenas que me esclarecessem a arte da comparação de imagens.

Obrigada

Cumprimentos

Edited by Leudassdf

Share this post


Link to post
Share on other sites
ribeiro55

Gostaria de saber se e possivel alterar a cor de uma imagem. por exemplo eu pego numa imagem a cores e quero converte-la para preto e branco. É possivel?

Sim. Sem olhar a pesos de canal, podes simplesmente somar o valor dos 3 canais, dividir por 3 e aplicar o resultado aos 3 canais como nova cor.

Se quiseres acrescentar os pesos de canal, eles são 30%, 59% e 11%.

Uma duvida se depois eu quiser comparar essa imagem mas o brilho do monitor for diferente a imagem ja vai ser diferente certo? Sera melhor

Não. A imagem é sempre a mesma. A forma como o monitor tas apresenta é completamente irrelevante.

A comparação depende da fiabilidade que pretendes.

A forma mais simples (e um pouco lenta para imagens grandes) é comparares todos os pixeis, onde o pior cenário de performance é percorrer toda a imagem (quando são iguais):

For x As Integer = 0 To B1.Width - 1
For y As Integer = 0 To B1.Height - 1
	If Not B1.GetPixel(x, y) = B2.GetPixel(x, y) Then MessageBox.Show("diferentes") : Exit Sub
Next
Next

Também podes criar representações do ficheiro, e comparar as representações.

Uma representação do ficheiro em Base64 por exemplo.

Edited by ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Leudassdf

Sim. Sem olhar a pesos de canal, podes simplesmente somar o valor dos 3 canais, dividir por 3 e aplicar o resultado aos 3 canais como nova cor.

Se quiseres acrescentar os pesos de canal, eles são 30%, 59% e 11%.

Não. A imagem é sempre a mesma. A forma como o monitor tas apresenta é completamente irrelevante.

A comparação depende da fiabilidade que pretendes.

A forma mais simples (e um pouco lenta para imagens grandes) é comparares todos os pixeis, onde o pior cenário de performance é percorrer toda a imagem (quando são iguais):

For x As Integer = 0 To B1.Width - 1
For y As Integer = 0 To B1.Height - 1
	If Not B1.GetPixel(x, y) = B2.GetPixel(x, y) Then MessageBox.Show("diferentes") : Exit Sub
Next
Next

Também podes criar representações do ficheiro, e comparar as representações.

Uma representação do ficheiro em Base64 por exemplo.

Boas Sergio

Penso que o brilho tem influencia. isto orque tirei 2 printscreen exactamente iguais mas com o brilho diferente e devolve-me sempre a mensagem "diferentes".

Ja agora ja tinha verificado que se usava a divisao por 3 para fazer o grayscale. Mas porque por 3?

Cumprimentos

Share this post


Link to post
Share on other sites
thoga31

Penso que o brilho tem influencia. isto orque tirei 2 printscreen exactamente iguais mas com o brilho diferente e devolve-me sempre a mensagem "diferentes".

Ja agora ja tinha verificado que se usava a divisao por 3 para fazer o grayscale. Mas porque por 3?

O brilho do monitor é uma definição deste que em nada influencia as imagens. O ficheiro tem sempre os mesmos bits, o brilho é apenas uma definição do monitor em si. Outra coisa é o brilho da imagem em si.

Seguindo essa lógica, quando mudas o brilho da imagem da tua televisão estás a mudar a imagem em toda a rede nacional :P

Em suma: definições do monitor != definições (bits) da imagem.

No código do Sérgio, faz uma pequena experiência. Suponho que o resultado seja o mesmo, mas nunca se sabe:

If Not (B1.GetPixel(x, y) = B2.GetPixel(x, y)) Then MessageBox.Show("diferentes") : Exit Sub

Ali uns parêntesis podem fazer a diferença. Não sei de cor a precedência dos operadores lógicos em VB.NET, mas em Pascal, por exemplo, é obrigatório os parêntesis porque a negação (Not) é prioritária em relação à igualdade (=). E como o VB.NET costuma fazer conversão implícita de variáveis, essa condição não dá o erro que daria no Pascal: Operator Not Overloaded, ou seja, o Not estava a influenciar um Integer e não um Boolean.

var a, b : boolean;
   n1, n2 : integer;
// ...

a := false;
b := false;
writeln( not a = b );   // retorna "FALSE"
writeln( not (a = b) ); // retorna "TRUE"

n1 := 1;
n2 := 2;
writeln( not n1 = n2 );   // erro na compilação, "Operator Not Overloaded"
writeln( not (n1 = n2) ); // retorna "TRUE"

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Leudassdf

O brilho do monitor é uma definição deste que em nada influencia as imagens. O ficheiro tem sempre os mesmos bits, o brilho é apenas uma definição do monitor em si. Outra coisa é o brilho da imagem em si.

Seguindo essa lógica, quando mudas o brilho da imagem da tua televisão estás a mudar a imagem em toda a rede nacional :P

Em suma: definições do monitor != definições (bits) da imagem.

No código do Sérgio, faz uma pequena experiência. Suponho que o resultado seja o mesmo, mas nunca se sabe:

If Not (B1.GetPixel(x, y) = B2.GetPixel(x, y)) Then MessageBox.Show("diferentes") : Exit Sub

Ali uns parêntesis podem fazer a diferença. Não sei de cor a precedência dos operadores lógicos em VB.NET, mas em Pascal, por exemplo, é obrigatório os parêntesis porque a negação (Not) é prioritária em relação à igualdade (=). E como o VB.NET costuma fazer conversão implícita de variáveis, essa condição não dá o erro que daria no Pascal: Operator Not Overloaded, ou seja, o Not estava a influenciar um Integer e não um Boolean.

var a, b : boolean;
n1, n2 : integer;
// ...

a := false;
b := false;
writeln( not a = b );   // retorna "FALSE"
writeln( not (a = b) ); // retorna "TRUE"

n1 := 1;
n2 := 2;
writeln( not n1 = n2 );   // erro na compilação, "Operator Not Overloaded"
writeln( not (n1 = n2) ); // retorna "TRUE"

Thoga31

Obrigada pela resposta. As alteraçoes do brilho que eu faço e ao nivel do monitor mas depois para fazer a comparaçao das imagens os pixeis ja sao diferentes.E que eu tenho 2 numeros exatamente iguais mas com brilhos de monitor diferentes. mas assim torna impossivel a comparaçao. Tambem ja tentei usar ocr recognition para tentar obter o valor numero das imagens mas a imagem e demasiado pequena e nao se consegue obter esses numeros. Mas nao sei o que mais posso fazer para consegui descobrir quais os numeros naquela imagem. Alguma ideia?

Cumprimentos

Share this post


Link to post
Share on other sites
thoga31

Thoga31

Obrigada pela resposta. As alteraçoes do brilho que eu faço e ao nivel do monitor mas depois para fazer a comparaçao das imagens os pixeis ja sao diferentes.E que eu tenho 2 numeros exatamente iguais mas com brilhos de monitor diferentes. mas assim torna impossivel a comparaçao. Tambem ja tentei usar ocr recognition para tentar obter o valor numero das imagens mas a imagem e demasiado pequena e nao se consegue obter esses numeros. Mas nao sei o que mais posso fazer para consegui descobrir quais os numeros naquela imagem. Alguma ideia?

Cumprimentos

Tens de entender que as definições do monitor não afectam a comparação de imagens. O programa não vai comprar os píxeis segundo o brilho do monitor, é impossível e/ou impraticável.

Tendo duas imagens do tipo Bitmap ou Image, faz-se a comparação que o @sergioribeiro disse. Em princípio tudo deverá dar bem.

Em último caso, salvo erro, pode-se fazer simplesmente o seguinte:

If B1 IsNot B2 Then MessageBox.Show("diferentes") : Exit Sub


Knowledge is free!

Share this post


Link to post
Share on other sites
Leudassdf

Tens de entender que as definições do monitor não afectam a comparação de imagens. O programa não vai comprar os píxeis segundo o brilho do monitor, é impossível e/ou impraticável.

Tendo duas imagens do tipo Bitmap ou Image, faz-se a comparação que o @sergioribeiro disse. Em princípio tudo deverá dar bem.

Em último caso, salvo erro, pode-se fazer simplesmente o seguinte:

If B1 IsNot B2 Then MessageBox.Show("diferentes") : Exit Sub

Ja consegui perceber. Nao sei o porque mas no desktop nao estava a funcionar corretamente. penso que era por eu estar a gravar as imagens no desktop e ao fazer o copyfromscreen a transparencia dos programas abertos permitia a visualizaçao dos novos ficheiros o que tornava a imagem diferente. Construi um novo "comparador" e realmente funciona. Obrigada.

Aproveito este topico para colocar a seguinte pergunta.

Certos programas e sites ao redimensionar as suas janelas redimensionam o tamanho dos seus objectos o que por sua vez leva a uma alteraçao da posiçao de um x objecto. Sabendo que um ponto x para uma janela 500X500 se encontra no ponto x100y20 ao redimensionar para o valor 650X650 conseguimos obter a nova localizaçao do ponto x??

Cumprimentos e obrigada a todos aqueles que me ajudaram.

Share this post


Link to post
Share on other sites
thoga31

Nesse caso o ponto não só está numa posição diferente como se transformou num pequeno quadrado de píxeis porque aumentou a resolução. Uma regra de 3 simples resolve-te isso directamente: "Se em 500x500 está em (100;20), então em 650x650 está em (x;y)", pelo que x = 650 * 100 / 500, e o y também. O "rácio de aumento", so to speak, será 650/500 = 1,3.


Knowledge is free!

Share this post


Link to post
Share on other sites
ribeiro55

Em offtopic, @thoga31, não podes negar uma cor, mas podes negar um teste de igualdade de cor.

Naquele caso não eram necessários parêntesis. Se houvessem mais testes lógicos encadeados, sim.

@Leudassdf, por a tua lógica, se eu desligar o monitor, os pixeis são todos pretos? :P

Até podes fazer CopyFromScreen e as tuas comparações todas com o monitor desligado, mesmo da placa gráfica, que o resultado vai ser o mesmo.

Edited by ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Leudassdf

Em offtopic, @thoga31, não podes negar uma cor, mas podes negar um teste de igualdade de cor.

Naquele caso não eram necessários parêntesis. Se houvessem mais testes lógicos encadeados, sim.

@Leudassdf, por a tua lógica, se eu desligar o monitor, os pixeis são todos pretos? :P

Até podes fazer CopyFromScreen e as tuas comparações todas com o monitor desligado, mesmo da placa gráfica, que o resultado vai ser o mesmo.

Realmente nao sabia que se podia tirar um print do ecra com o monitor desligado. nunca precisei:D

Mas obrigada pela informaçao.

Se eu mudar a resoluçao do monitor e copiar num ponto especifica sempre com o mesmo tamanho as duas imagens vao fiar iguais a mesma certo? ou seja se eu tirar 2 prints exatamente a mesma "coisa" mas com resoluções diferentes as imagens vao ser iguais a mesma correto? Por ex se fizer um print com comprimento 30 e altura 30 a partir do mesmo ponto 0-0 com uma resoluçao de 1920-1080 e o seguinte print for com a resoluçao 1280-800 a imagem vai ser exactamente igual correto?

Outra coisa as cores do ecra vao ser sempre iguais independentemente da placa grafica? por exemplo se tiver uma cor 255-0-0 vermelho, noutro computador com uma placa grafica diferente ela ficara sempre 255-0-0 ou seja os pixeis irao ser iguais certo? Obrigada por tuda a ajuda que me prestaram, e os excelentes esclarecimentos. :)

Share this post


Link to post
Share on other sites
thoga31

Tu confundes muito 1) monitor, 2) placa gráfica e 3) ficheiro de imagem.

O computador irá enviar informações gráficas para a placa gráfica e esta, por sua vez, tradu-las de forma a que o monitor as entenda e reproduza em pontinhos de luz para que o ser humano compreenda (pixeis). Como é que a imagem do desktop chega ao monitor? Não é o monitor que a produz: o OS produ-la de uma forma que é traduzida em imagem pela GPU e que o monitor a traduz em luz visível. Na essência, qualquer imagem mostrada pelo monitor é a tradução de um calhamaço de bits para luz visível. Por isso, um Print Screen obtém os bits do momento que definem a imagem actual, quer o monitor esteja ligado ou desligado. O monitor só recebe informação, não envia - é um dispositivo só de output.

Então tu tens uma imagem JPG. Mete-la numa pen. Agora vais a um PC que está ligado a um monitor que tem o brilho definido a muito elevado a gosto do utilizador. Depois colocas a pen noutro PC, como o meu, que tem muito menos brilho porque a mim muito brilho fere-me os olhos. O ficheiro JPG modificou? Claro que não!

A modificação de imagem que ocorreu de um monitor para o outro ocorre já no monitor: é como uma televisão - o sinal é o mesmo, a imagem só muda consoante as definições locais. Se eu quiser, posso metê-la a P&B! Mas eu recebo o sinal a cores.

O monitor é o mesmo: recebe o sinal "real" e adapta consoante as suas próprias modificações locais - brilho, contraste, posição, etc etc...

Está isto devidamente esclarecido? :)

Em offtopic, @thoga31, não podes negar uma cor, mas podes negar um teste de igualdade de cor.

Naquele caso não eram necessários parêntesis. Se houvessem mais testes lógicos encadeados, sim.

Pois, eu não me recordo bem como é em VB.NET, mas em Pascal aquele Not daria erro na compilação. Por isso é que falei avisando que não tinha certezas. Assim já fiquei a saber, obrigado :)


Knowledge is free!

Share this post


Link to post
Share on other sites
Leudassdf

Tu confundes muito 1) monitor, 2) placa gráfica e 3) ficheiro de imagem.

O computador irá enviar informações gráficas para a placa gráfica e esta, por sua vez, tradu-las de forma a que o monitor as entenda e reproduza em pontinhos de luz para que o ser humano compreenda (pixeis). Como é que a imagem do desktop chega ao monitor? Não é o monitor que a produz: o OS produ-la de uma forma que é traduzida em imagem pela GPU e que o monitor a traduz em luz visível. Na essência, qualquer imagem mostrada pelo monitor é a tradução de um calhamaço de bits para luz visível. Por isso, um Print Screen obtém os bits do momento que definem a imagem actual, quer o monitor esteja ligado ou desligado. O monitor só recebe informação, não envia - é um dispositivo só de output.

Então tu tens uma imagem JPG. Mete-la numa pen. Agora vais a um PC que está ligado a um monitor que tem o brilho definido a muito elevado a gosto do utilizador. Depois colocas a pen noutro PC, como o meu, que tem muito menos brilho porque a mim muito brilho fere-me os olhos. O ficheiro JPG modificou? Claro que não!

A modificação de imagem que ocorreu de um monitor para o outro ocorre já no monitor: é como uma televisão - o sinal é o mesmo, a imagem só muda consoante as definições locais. Se eu quiser, posso metê-la a P&B! Mas eu recebo o sinal a cores.

O monitor é o mesmo: recebe o sinal "real" e adapta consoante as suas próprias modificações locais - brilho, contraste, posição, etc etc...

Está isto devidamente esclarecido? :)

Pois, eu não me recordo bem como é em VB.NET, mas em Pascal aquele Not daria erro na compilação. Por isso é que falei avisando que não tinha certezas. Assim já fiquei a saber, obrigado :)

Sim está. obrigada....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.