-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterpolacao.py
105 lines (81 loc) · 4.37 KB
/
interpolacao.py
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
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from numpy import uint8
def imprime_imagem(titulo, imagem):
# Monta a imagem novamente e imprime
cv.imshow(titulo, imagem)
cv.waitKey(0)
cv.destroyAllWindows()
def cria_nova_imagem(altura, largura):
# Cria uma nova imagem vazia com base nas dimensões passadas
return np.zeros((altura, largura, 3), uint8)
def vizinho_reducao(imagem):
# Reduz a imagem usando interpolação por vizinho mais próximo
nova_imagem = cria_nova_imagem(int(imagem.shape[0] / 2), int(imagem.shape[1] / 2))
for i in range(nova_imagem.shape[0]):
for j in range(nova_imagem.shape[1]):
nova_imagem[i, j] = imagem[i + i, j + j]
return nova_imagem
def vizinho_ampliacao(imagem):
# Amplia a imagem usando a interpolação por vizinho mais próximo
nova_imagem = cria_nova_imagem(imagem.shape[0] * 2, imagem.shape[1] * 2)
for i in range(imagem.shape[0]):
for j in range(imagem.shape[1]):
nova_imagem[i + i, j + j] = imagem[i, j]
for i in range(0, nova_imagem.shape[0], 2):
for j in range(0, nova_imagem.shape[1], 2):
nova_imagem[i, j + 1] = nova_imagem[i, j]
nova_imagem[i + 1, j] = nova_imagem[i, j]
nova_imagem[i + 1, j + 1] = nova_imagem[i, j]
return nova_imagem
def bicubica_reducao(imagem):
# Reduz a imagem usando a interpolação bicubica
nova_imagem = cria_nova_imagem(int(imagem.shape[0] / 2), int(imagem.shape[1] / 2))
for i in range(nova_imagem.shape[0]):
for j in range(nova_imagem.shape[1]):
if j == nova_imagem.shape[1] - 1 and i != nova_imagem.shape[0] - 1:
# Borda direita
valor = np.int_(imagem[i + i, j + j]) + np.int_(imagem[i + i, j + j + 1]) + np.int_(
imagem[i + i, j + j + 1])
valor += np.int_(imagem[i + i + 1, j + j]) + np.int_(imagem[i + i + 1, j + j + 1]) + np.int_(
imagem[i + i + 1, j + j + 1])
valor += np.int_(imagem[i + i + 2, j + j]) + np.int_(imagem[i + i + 2, j + j + 1]) + np.int_(
imagem[i + i + 2, j + j + 1])
valor = np.true_divide(valor, 9)
elif i == nova_imagem.shape[0] - 1 and j != nova_imagem.shape[1] - 1:
# Borda inferior
valor = np.int_(imagem[i + i, j + j]) + np.int_(imagem[i + i, j + j + 1]) + np.int_(
imagem[i + i, j + j + 2])
valor += np.int_(imagem[i + i + 1, j + j]) + np.int_(imagem[i + i + 1, j + j + 1]) + np.int_(
imagem[i + i + 1, j + j + 2])
valor += np.int_(imagem[i + i + 1, j + j]) + np.int_(imagem[i + i + 1, j + j + 1]) + np.int_(
imagem[i + i + 1, j + j + 2])
valor = np.true_divide(valor, 9)
elif i == nova_imagem.shape[0] - 1 and j == nova_imagem.shape[1] - 1:
# Canto inferior direito
valor = np.int_(imagem[i + i, j + j]) + np.int_(imagem[i + i, j + j + 1]) + np.int_(
imagem[i + i, j + j + 1])
valor += np.int_(imagem[i + i + 1, j + j]) + np.int_(imagem[i + i + 1, j + j + 1]) + np.int_(
imagem[i + i + 1, j + j + 1])
valor += np.int_(imagem[i + i + 1, j + j]) + np.int_(imagem[i + i + 1, j + j + 1]) + np.int_(
imagem[i + i + 1, j + j + 1])
valor = np.true_divide(valor, 9)
else:
# Todo o resto
valor = np.int_(imagem[i + i, j + j]) + np.int_(imagem[i + i, j + j + 1]) + np.int_(
imagem[i + i, j + j + 2])
valor += np.int_(imagem[i + i + 1, j + j]) + np.int_(imagem[i + i + 1, j + j + 1]) + np.int_(
imagem[i + i + 1, j + j + 2])
valor += np.int_(imagem[i + i + 2, j + j]) + np.int_(imagem[i + i + 2, j + j + 1]) + np.int_(
imagem[i + i + 2, j + j + 2])
valor = np.true_divide(valor, 9)
nova_imagem[i, j] = valor
return nova_imagem
def bicubico_ampliacao(imagem):
# Amplia a imagem usando a interpolação bicubica
nova_imagem = cria_nova_imagem(imagem.shape[0] * 2, imagem.shape[1] * 2)
for i in range(imagem.shape[0]):
for j in range(imagem.shape[1]):
nova_imagem[i + i, j + j] = imagem[i, j]
return nova_imagem