Manipulação de imagens no formato PPM
O artigo seguinte faz uma introdução sobre o formato ".ppm", que faz o armazenamento de forma simples e "bruta" de imagens. Além de como manipular o arquivo, para podermos aplicar filtros de imagem já existentes ou criar nossos próprios filtros.
[ Hits: 33.023 ]
Por: Pablo Margreff em 16/01/2015 | Blog: https://pmargreff.wordpress.com/
void gray_scale(pixel imagem[MAX][MAX], int coluna, int linha) { int i, j; for (i = 0; i < linha; i++){ for (j = 0; j < coluna; j++){ imagem[i][j].r = (int) ((0.299 * imagem[i][j].r) + (0.587 * imagem[i][j].g) + (0.144 * imagem[i][j].b)); //calcula o valor para conversão imagem[i][j].g = imagem[i][j].r; //copia o valor para imagem[i][j].b = imagem[i][j].r; //todas componentes //testa o valor para ver se o mesmo não passou de 255 if (imagem[i][j].r > 255){ imagem[i][j].r = 255; imagem[i][j].g = 255; imagem[i][j].b = 255; } } } }
void autorelevo(pixel imagem[MAX][MAX], int coluna, int linha) { pixel img[linha][coluna]; // cria uma imagem para salvar o resultado do emboss int i, j; for (i = 1; i < linha - 1; i++){ for (j = 0; j < coluna; j++){ img[i][j].r = imagem[i + 1][j].r - imagem[i -1][j].r; //faz a operação passando o img[i][j].g = imagem[i + 1][j].b - imagem[i -1][j].b; //resultado para a matriz de img[i][j].b = imagem[i + 1][j].b - imagem[i -1][j].b; //backup if (img[i][j].r < 0) //testa os limites img[i][j].r = 0; if (img[i][j].g < 0) img[i][j].g = 0; if (img[i][j].b < 0) img[i][j].b = 0; } } for (i = 1; i < linha - 1; i++){ for(j = 0; j < coluna; j++){ imagem[i][j].r = img[i][j].r + 128; //adiciona 128 para clarear a imagem imagem[i][j].g = img[i][j].g + 128; imagem[i][j].b = img[i][j].b + 128; if (img[i][j].r > 255) //testa os limites img[i][j].r = 255; if (img[i][j].g > 255) img[i][j].g = 255; if (img[i][j].b > 255) img[i][j].b = 255; } } }
0 -1 0 0 C 0 0 1 0Onde o pixel central é substituído pela soma do negativo imediatamente acima, e o valor positivo imediatamente abaixo, depois testamos os limites. Lembrando que usamos uma matriz para guardar os resultados, já que se alterarmos o valor imediatamente após realizarmos a conta, haveria interferência, pois usamos os pixeis para calcular os da próxima linha. Depois que tudo é calculado a matriz resposta é passada para a matriz original.
void espelhar(pixel imagem[MAX][MAX], int coluna, int linha) { pixel img[linha][coluna]; int i, j; for (i = 0; i < linha; i++) { for (j = 0; j < coluna; j++) { img[i][j].r = imagem[i][coluna - j].r; //salva em uma matriz do tipo pixel a imagem com suas img[i][j].g = imagem[i][coluna - j].g; //linhas salvas em complementos, isso faz com que a imagem img[i][j].b = imagem[i][coluna - j].b; //pegue o pixel complementar no seu extremo oposto horizontal } } //passa a imagem para a matriz original for (i = 0; i < linha; i++) { for (j = 0; j < coluna; j++) { imagem[i][j].r = img[i][j].r; imagem[i][j].g = img[i][j].g; imagem[i][j].b = img[i][j].b; } } }
Aumentando sua produtividade com o teclado padrão Dvorak
DoTheWorld - Biblioteca completa para manipulação de Arquivos e Pastas em C
Manipulando arquivos em C (parte 1)
Manipulação de arquivos em C++
Manipulando arquivos em C (parte 2)
Instalando Facebook Folly através do Conan
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Falha com leitor de digitais no Ubuntu: sugestões? (0)
Problema em SSD ao dar boot LinuxMint LMDE FAYE 64 (1)