Sei sulla pagina 1di 8

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE

TRABALHO DE RESTAURAÇÃO DE IMAGEM

Daniel Silva de Oliveira – 2008020371


Daniel Melo da Silva – 2009035992

Natal, 7 de Maio de 2011


Introdução

Utilizando métodos numéricos, uma foto preto e branca pode ter suas falhas (em
preto) restauradas. Para isso foram necessárias as ferramentas Dev C++ e o OpenCV para o
tratamento da imagem.
Desenvolvimento

Abaixo está o código utilizado para a restauração da imagem.

#include <iostream>

#include "cv.h"

#include "highgui.h"

using namespace cv;

int main(int argc, char** argv){

Mat image, image1, mask;

int width, height;

image = imread("imagem.png",-1);

mask = imread("mascara.png",-1);

std::cout << "channels =" << image.channels() << "\n";

if(!image.data){

std::cout << "imagem nao carregou corretamente\n";

return(-1);

width=image.size().width;

height=image.size().height;

imshow("original", image);

image.convertTo(image1,CV_32F);

image1.convertTo(image,CV_32F);
while(1){

for(int i=0; i<height; i++){

for(int j = 0; j < width; j++){

//if(i==0){

if( (j == 0) && (mask.at<uchar>(i, j) == 0) )

image1.at<float>(i, j) = ( image.at<float>(i, j + 1) + image.at<float>(i + 1, j) ) / 2;

else if( (j == height - 1) && (mask.at<float>(i, j) == 0) )

image1.at<float>(i, j) = ( image.at<float>(i, j - 1) + image.at<float>(i + 1, j) ) / 2;

else if(mask.at<float>(i, j) == 0)

image1.at<float>(i, j) = ( image.at<float>(i, j + 1) + image.at<float>(i + 1, j) +


image.at<float>(i, j - 1) ) / 3;

//} else if(j == 0) {

if( (i == 0) && (mask.at<uchar>(i, j) == 0) )

image1.at<float>(i, j) = ( image.at<float>(i + 1, j) + image.at<float>(i, j + 1) ) / 2;

else if( (i == width - 1) && (mask.at<float>(i, j) == 0) )

image1.at<float>(i, j) = ( image.at<float>(i - 1, j) + image.at<float>(i, j + 1) ) / 2;

else if(mask.at<float>(i, j) == 0)

image1.at<float>(i, j) = ( image.at<float>(i + 1, j) + image.at<float>(i, j + 1) +


image.at<float>(i - 1, j) ) / 3;

//else if(mask.at<float>(i, j) == 0)

// image1.at<float>(i, j) = ( image.at<float>(i, j + 1) + image.at<float>(i + 1, j) +


image.at<float>(i - 1, j) + image.at<float>(i, j - 1) ) / 4;

//}//end-if-else

}//end-for

}//end-for

swap(image1, image);

image1.convertTo(im1,CV_8U);

if(waitKey(30) == 27) break;


}//end-while

imshow("processada", image);

imshow("mascara",mask);

waitKey();

return 0;

O funcionamento é basicamente o seguinte, a imagem original e a máscara com as


manchas pretas são carregadas, e enquanto o método vai calculando os novos valores para os
pontos pretos na imagem, o resultado vai sendo mostrando em tempo de execução
substituindo a imagem originalmente a ser editada.

Abaixo encontram-se alguns passos da iteração do programa em questão.

Passo 1:

Passo 2:
Passo 3:

Passo 4:
Passo 5:
Referencias

Dev C++

OpenCV

Slides enviados via sigaa (www.sigaa.ufrn.br).

Potrebbero piacerti anche