This repository has been archived by the owner on Aug 10, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNovoSuavizador.java
207 lines (159 loc) · 7.25 KB
/
NovoSuavizador.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
import java.util.*;
class NovoVisualizador
{
public static void main(String[] args)
{
boolean fim = false;
String nome = "a";
while(!fim)
{
System.out.println("Menu");
System.out.println("====");
System.out.println("1) Ler imagem");
System.out.println("2) Visualizar imagem");
System.out.println("3) Suavizar com filtro médio");
System.out.println("4) Suavizar com filtro mediano");
System.out.println("5) Suavizar com filtro gaussiano");
System.out.println("6) Gravar imagem");
System.out.println("7) Fim");
// Cria instância do visualizador
Scanner sc = new Scanner(System.in);
// Instanciando um objeto da classe Scanner, para interação
// com o usuário via teclado.
System.out.println("Qual a sua opção?");
int opcao = sc.nextInt();
// Permite ao usuário escolher uma opção no menu. A entrada
// deve ser um int.
if(opcao == 1) // Opção1: Carregar imagem
{
System.out.println("Digite o nome do arquivo:");
nome = sc.next();
}
Imagem imagemDoUsuario = LeituraEscritaImagem.leImagem(nome);
// Cria um objeto da classe 'Imagem' que tem o mesmo endereço de
// memória do retorno do método 'LeituraEscritaImagem', o qual
// é também um objeto da classe 'Imagem' cujo atributo 'pixel'
// (um vetor de inteiros) armazena as intensidades das cores cor-
// respondentes a cada pixel da imagem.
String nomeDaCopia;
// Variável para armazenar o nome do arquivo que, posteriormente,
// será criado na pasta da imagem original, armazenando a imagem suavizada.
if(imagemDoUsuario == null)
// Checa se a imagem do usuário teve retorno 'null', caso padrão
// de retorno adotado pela classe 'LeituraEscritaImagem' no método
// 'leImagem' quando há uma exceção lançada.
System.out.println("Arquivo não existente ou problema na leitura");
else // Caso tudo tenha ocorrido bem
{
nomeDaCopia = nome + "_copia.pgm";
// Faz o nome do arquivo que, posteriormente, será criado na pas-
// ta da imagem original, armazenando a imagem suavizada.
LeituraEscritaImagem.escreveImagem(nomeDaCopia, imagemDoUsuario);
// Cria um novo arquivo com a cópia, baseada na cópia suavizada.
}
if(opcao == 2) // Opção2: Visualizar imagem
{
VisualizadorImagem vis = new VisualizadorImagem();
if(imagemDoUsuario == null)
// Checa se a imagem do usuário teve retorno 'null', caso padrão
// de retorno adotado pela classe 'LeituraEscritaImagem' no método
// 'leImagem' quando há uma exceção lançada.
System.out.println("Arquivo não existente ou problema na leitura");
else
vis.mostraImagem(imagemDoUsuario, nome);
}
if(opcao == 3) // Opção 3: filtro médio
{
boolean entradaCorreta = false;
while(!entradaCorreta)
{
System.out.println("Qual o tamanho da vizinhança desejado?");
try { // Pegando a possível exceção lançada pelo método 'filtro
// medio', da classe 'Imagem', quando colocados valores pa-
// res, negativos ou não inteiros como tamanho da vizinhança.
int tamanho = sc.nextInt();
imagemDoUsuario.filtroMedio(tamanho);
} catch(ArithmeticException e) {
System.out.println("Só são aceitos tamanhos ímpares e positivos de vizinhança!");
continue;
} catch(InputMismatchException e) {
System.out.println("Só são aceitos valores inteiros!");
break;
}
entradaCorreta = true;
} // while(!entradaCorreta)
} // if(opcao == 3)
if(opcao == 4) // Opção 4: filtro mediano
{
boolean entradaCorreta = false;
while(!entradaCorreta)
{
System.out.println("Qual o tamanho da vizinhança desejado?");
try { // Pegando a possível exceção lançada pelo método 'filtro
// mediano', da classe 'Imagem', quando colocados valores
// pares, negativos ou não inteiros como tamanho da vizinhança.
int tamanho = sc.nextInt();
imagemDoUsuario.filtroMediano(tamanho);
} catch(ArithmeticException e) {
System.out.println("Só são aceitos tamanhos ímpares e positivos de vizinhança!");
continue;
} catch(InputMismatchException e) {
System.out.println("Só são aceitos valores inteiros!");
break;
}
entradaCorreta = true;
} // while(!entradaCorreta)
} // if(opcao == 4)
/*----------------------------------------------------*/
if(opcao == 5) // Opção 5: filtro gaussiano
{
boolean entradaCorreta = false;
int tamanho = 0;
double sigma = 0;
while(!entradaCorreta)
{
System.out.println("Qual o tamanho da vizinhança desejado?");
try { // Pegando a possível exceção lançada pelo método 'filtro
// mediano', da classe 'Imagem', quando colocados valores
// pares, negativos ou não inteiros como tamanho da vizinhança.
tamanho = sc.nextInt();
imagemDoUsuario.filtroMediano(tamanho);
} catch(InputMismatchException e) {
System.out.println("Só são aceitos valores inteiros!");
break;
}
entradaCorreta = true;
}
entradaCorreta = false;
while(!entradaCorreta)
{
System.out.println("Qual o tamanho desejado para o desvio-padrão?");
try { // Pegando a possível exceção lançada pelo método 'filtro
// medio', da classe 'Imagem', quando colocados valores pa-
// res, negativos ou não numéricos como tamanho da vizinhança.
sigma = sc.nextDouble();
} catch(InputMismatchException e) {
System.out.println("Só são aceitos valores numéricos!");
break;
}
entradaCorreta = true;
} // while(!entradaCorretaSigma)
entradaCorreta = false;
while(!entradaCorreta)
{
try { // Pegando a possível exceção lançada pelo método 'filtro
// medio', da classe 'Imagem', quando colocados valores pa-
// res, negativos ou não numéricos como tamanho da vizinhança.
imagemDoUsuario.filtroGaussiano(sigma, tamanho);
} catch(InputMismatchException e) {
System.out.println("Só são aceitos valores numéricos!");
break;
}
entradaCorreta = true;
}
} // if(opcao == 5)
// Mostra imagem
//vis.mostraImagem(imagemDoUsuario, "Barbara.pgm");
} // while(!fim)
} // main
} // Class NovoVisualizador