Ir para o conteúdo
thinkabout

Matriz Original MxM reduzir para Matriz Média

Mensagens Recomendadas

thinkabout

Boas Pessoal,

Sei correr a matriz na horizontal e na vertical, contudo tenho que correr a matriz em "quadrados", não estou a ver como.

Agradeço ideias.

#include <stdio.h>
#define M 8
/*
19. Pretende-se reduzir uma imagem a metade do seu tamanho original. A imagem inicial
consiste num array bidimensional com M×M valores inteiros onde cada pixel (ponto na imagem)
pode tomar um valor inteiro entre 0 e 9 (tonalidades de cinza). A imagem reduzida é armazenada
num array bidimensional com M/2×M/2 valores reais onde cada elemento (pixel) corresponde á
média dos 4 elementos que substitui. Para melhor compreensão do enunciado veja o exemplo
apresentado de seguida (neste caso, para M=8):
Imagem original
0 4 9 3 6 7 2 9
9 4 7 8 3 4 7 2
5 1 2 6 3 8 6 2
7 1 4 8 7 2 0 7
4 9 3 5 2 1 5 7
5 3 4 7 8 9 1 0
2 3 5 6 7 9 2 4
2 3 4 5 6 7 8 9
 Imagem reduzida
 4.3 6.8 5.0 5.0
 3.5 5.0 5.0 3.8
 5.3 4.8 5.0 3.3
 2.5 5.0 7.3 5.8
Escreva uma função em C que efectue esta operação. A função recebe 3 argumentos: endereço do
primeiro elemento da matriz original, endereço do primeiro elemento da matriz reduzida e o valor
M
*/

void calculamedia(int *matriz, float *matrizmedia, int m)
{
for (i = 0; i < M; i++)
{
}

}

int main()
{

int matriz[M][M] =	  {{0, 4, 9, 3, 6, 7, 2, 9},
					 {9, 4, 7, 8, 3, 4, 7, 2},
					 {5, 1, 2, 6, 3, 8, 6, 2},
					 {7, 1, 4, 8, 7, 2, 0, 7},
					 {4, 9, 3, 5, 2, 1, 5, 7},
					 {5, 3, 4, 7, 8, 9, 1, 0},
					 {2, 3, 5, 6, 7, 9, 2, 4},
					 {2, 3, 4, 5, 6, 7, 8, 9}};

float matrizmedia[M/2][M/2] = {0.0};

calculamedia(matriz[0], matrizmedia[0], M);

// Falta função para impressão da matriz.
return 0;
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
void calculamedia(int *matriz, double *matrizmedia, int m) // <--- double
{
int i, j;
int sum;

for (i = 0; i < m; i += 2)
{
	for (j = 0; j < m; j += 2)
	{
		sum  = /* matriz[i][j] */
		sum += /* matriz[i][j+1] */
		sum += /* matriz[i+1][j] */
		sum += /* matriz[i+1][j+1] */

		/* matrizmedia[i][j] = (double)sum / 4; */
	}
}
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

;)

Se existir forma de simplificar agradeço ideias :).

void calculamedia(int *matriz, double *matrizmedia, int tamanho)
{
int i, j,z=0,y=0;
int sum;
// Imprimir a matriz original
printf("\n Matriz Original \n");
for (i = 0; i < m*8; i ++)
{
 printf(" %d" , *(matriz+i));
 z++;
 if (z==tamanho)
 {
  puts("");
  z=0;
 }
}
puts("");
// Faz a soma dos numeros depois a devisão para calcular media e insere na matrizmedia
for (i = 0; i < tamanho*tamanho; i += tamanho*2)
{
 for (j = 0; j < tamanho; j += 2)
 {
  sum  = *(matriz + i + j);			 /* matriz[i][j]	  -> 0 */
  printf("Estou a comecar no indice %d %d",i,j); // Debug
  sum += *(matriz + i+1 + j);		   /* matriz[i+1][j]	-> 4  */
  sum += *(matriz + i + j+tamanho);	 /* matriz[i][j+1]	-> 9  */
  sum += *(matriz + i+1 + j+tamanho);   /* matriz[i+1][j+1]  -> 4  */
  printf(" ---- O valor total da e soma %d \n", sum);  // Debug
  // Passar os valores para a matrizmedia
  *(matrizmedia + y) = (double)sum / 4;
  y++;  
 }  
}  
// Imprimir a matriz reduzida
printf("\n Matriz Reduzida \n");
for (i = 0; i < m*2; i++)
{
 printf(" %.1lf" , *(matrizmedia+i));
 z++;
 if (z==tamanho/2)
 {
  puts("");
  z=0;
 }
}
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

vi agora que tinha os índices errados na atribuição à matriz reduzida :D ao menos viste isso e corrigiste ;)

simplificar ? simples :

mete a impressão da matriz numa função e tira da função redução

isso não é passo para ser feito dentro da função redução


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.