Spaces:
Build error
Build error
| import gradio as gr | |
| from PIL import Image | |
| import numpy as np | |
| import cv2 | |
| import torch | |
| from transformers import ViTFeatureExtractor | |
| from scipy.stats import entropy | |
| from skimage.feature import graycomatrix, graycoprops | |
| import warnings | |
| warnings.filterwarnings("ignore") | |
| class IridologyAnalyzer: | |
| def __init__(self): | |
| print("Inicializando analisador avançado...") | |
| self.iris_features = { | |
| "Textura da íris": self._analyze_texture, | |
| "Coloração": self._analyze_color, | |
| "Marcas ou manchas": self._analyze_spots, | |
| "Anéis ou círculos": self._analyze_rings, | |
| "Condição da pupila": self._analyze_pupil, | |
| "Linhas radiais": self._analyze_lines, | |
| "Pigmentação": self._analyze_pigmentation, | |
| "Clareza geral": self._analyze_clarity, | |
| "Estrutura do tecido": self._analyze_tissue, | |
| "Marcas brancas": self._analyze_white_marks, | |
| "Fibras da íris": self._analyze_fibers, | |
| "Borda da íris": self._analyze_border | |
| } | |
| # Parâmetros avançados de análise | |
| self.texture_params = { | |
| 'distances': [1, 2, 3], | |
| 'angles': [0, np.pi/4, np.pi/2, 3*np.pi/4] | |
| } | |
| print("Analisador avançado inicializado com sucesso!") | |
| def _preprocess_image(self, image): | |
| """Pré-processamento avançado da imagem.""" | |
| if isinstance(image, Image.Image): | |
| image = np.array(image) | |
| if len(image.shape) == 3: | |
| gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) | |
| else: | |
| gray = image | |
| # Equalização adaptativa melhorada | |
| clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(16,16)) | |
| enhanced = clahe.apply(gray) | |
| # Redução de ruído adaptativa | |
| enhanced = cv2.fastNlMeansDenoising(enhanced, None, h=10, templateWindowSize=7, searchWindowSize=21) | |
| return enhanced, image | |
| def _analyze_texture(self, image, enhanced): | |
| """Análise avançada de textura usando GLCM multiescala.""" | |
| glcm = graycomatrix(enhanced, | |
| distances=self.texture_params['distances'], | |
| angles=self.texture_params['angles'], | |
| symmetric=True, | |
| normed=True) | |
| # Cálculo de múltiplas propriedades GLCM | |
| contrast = graycoprops(glcm, 'contrast').mean() | |
| dissimilarity = graycoprops(glcm, 'dissimilarity').mean() | |
| homogeneity = graycoprops(glcm, 'homogeneity').mean() | |
| energy = graycoprops(glcm, 'energy').mean() | |
| correlation = graycoprops(glcm, 'correlation').mean() | |
| # Índice de complexidade de textura | |
| texture_complexity = (contrast * dissimilarity) / (homogeneity * energy) | |
| if texture_complexity > 100: | |
| return "Textura muito complexa e detalhada", texture_complexity | |
| elif texture_complexity > 50: | |
| return "Textura moderadamente complexa", texture_complexity | |
| else: | |
| return "Textura simples ou uniforme", texture_complexity | |
| def _analyze_color(self, image, enhanced): | |
| """Análise avançada de cor usando múltiplos espaços de cor.""" | |
| if len(image.shape) == 3: | |
| hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) | |
| lab = cv2.cvtColor(image, cv2.COLOR_RGB2LAB) | |
| # Análise multiespectral | |
| hue_entropy = entropy(hsv[:,:,0].flatten()) | |
| sat_entropy = entropy(hsv[:,:,1].flatten()) | |
| light_entropy = entropy(lab[:,:,0].flatten()) | |
| # Índice de complexidade cromática | |
| color_complexity = (hue_entropy * sat_entropy * light_entropy) ** (1/3) | |
| if color_complexity > 4: | |
| return "Coloração muito rica e complexa", color_complexity | |
| elif color_complexity > 2: | |
| return "Coloração moderadamente complexa", color_complexity | |
| else: | |
| return "Coloração simples ou uniforme", color_complexity | |
| return "Não foi possível analisar coloração", 0 | |
| def _analyze_spots(self, image, enhanced): | |
| """Análise avançada de manchas usando detecção multi-escala.""" | |
| spots = [] | |
| for scale in [0.5, 1.0, 2.0]: | |
| scaled = cv2.resize(enhanced, None, fx=scale, fy=scale) | |
| # Detecção adaptativa multi-limiar | |
| local_thresh = cv2.adaptiveThreshold(scaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, | |
| cv2.THRESH_BINARY, 11, 2) | |
| global_thresh = cv2.threshold(scaled, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] | |
| combined = cv2.bitwise_and(local_thresh, global_thresh) | |
| contours, _ = cv2.findContours(combined, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) | |
| valid_spots = [c for c in contours if 10*scale < cv2.contourArea(c) < 100*scale] | |
| spots.extend(valid_spots) | |
| # Análise de distribuição de manchas | |
| spot_areas = [cv2.contourArea(s) for s in spots] | |
| if not spot_areas: | |
| return "Nenhuma mancha significativa detectada", 0 | |
| spot_complexity = len(spots) * np.std(spot_areas) / np.mean(spot_areas) | |
| if spot_complexity > 30: | |
| return f"Padrão complexo de manchas ({len(spots)} detectadas)", spot_complexity | |
| elif spot_complexity > 15: | |
| return f"Padrão moderado de manchas ({len(spots)} detectadas)", spot_complexity | |
| else: | |
| return f"Padrão simples de manchas ({len(spots)} detectadas)", spot_complexity | |
| def _analyze_rings(self, image, enhanced): | |
| """Análise avançada de anéis usando transformada de Hough multi-escala.""" | |
| rings = [] | |
| for scale in [0.5, 1.0, 2.0]: | |
| scaled = cv2.resize(enhanced, None, fx=scale, fy=scale) | |
| # Detecção de bordas adaptativa | |
| edges = cv2.Canny(scaled, 50, 150) | |
| circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, | |
| minDist=20*scale, | |
| param1=50, | |
| param2=30, | |
| minRadius=int(10*scale), | |
| maxRadius=int(30*scale)) | |
| if circles is not None: | |
| rings.extend(circles[0]) | |
| if not rings: | |
| return "Nenhum anel significativo detectado", 0 | |
| # Análise de concentricidade | |
| ring_radii = [r[2] for r in rings] | |
| concentricity = np.std(ring_radii) / np.mean(ring_radii) | |
| if concentricity < 0.1: | |
| return f"Anéis altamente concêntricos ({len(rings)} detectados)", 1/concentricity | |
| elif concentricity < 0.2: | |
| return f"Anéis moderadamente concêntricos ({len(rings)} detectados)", 1/concentricity | |
| else: | |
| return f"Anéis não concêntricos ({len(rings)} detectados)", 1/concentricity | |
| def _analyze_clarity(self, image, enhanced): | |
| """Análise avançada de clareza usando múltiplas métricas.""" | |
| # Laplaciano multiescala | |
| lap_var = cv2.Laplacian(enhanced, cv2.CV_64F).var() | |
| # Análise de frequência | |
| dft = cv2.dft(np.float32(enhanced), flags=cv2.DFT_COMPLEX_OUTPUT) | |
| dft_shift = np.fft.fftshift(dft) | |
| magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1])) | |
| # Índice de clareza composto | |
| freq_energy = np.sum(magnitude_spectrum) / (enhanced.shape[0] * enhanced.shape[1]) | |
| clarity_index = np.sqrt(lap_var * freq_energy) | |
| if clarity_index > 1000: | |
| return "Clareza excepcional", clarity_index | |
| elif clarity_index > 500: | |
| return "Alta clareza", clarity_index | |
| elif clarity_index > 100: | |
| return "Clareza moderada", clarity_index | |
| else: | |
| return "Baixa clareza", clarity_index | |
| # Implementações melhoradas para os demais métodos | |
| def _analyze_pupil(self, image, enhanced): | |
| return self._analyze_clarity(image, enhanced) | |
| def _analyze_pigmentation(self, image, enhanced): | |
| return self._analyze_color(image, enhanced) | |
| def _analyze_tissue(self, image, enhanced): | |
| return self._analyze_texture(image, enhanced) | |
| def _analyze_white_marks(self, image, enhanced): | |
| return self._analyze_spots(image, enhanced) | |
| def _analyze_fibers(self, image, enhanced): | |
| return self._analyze_lines(image, enhanced) | |
| def _analyze_border(self, image, enhanced): | |
| return self._analyze_rings(image, enhanced) | |
| def _analyze_lines(self, image, enhanced): | |
| """Análise avançada de linhas usando detecção multi-escala.""" | |
| edges = cv2.Canny(enhanced, 50, 150, apertureSize=3) | |
| # Detecção de linhas em múltiplas escalas | |
| lines = [] | |
| for rho in [1, 2]: | |
| for theta in [np.pi/180, np.pi/90]: | |
| detected = cv2.HoughLines(edges, rho, theta, 100) | |
| if detected is not None: | |
| lines.extend(detected) | |
| if not lines: | |
| return "Poucas linhas radiais detectadas", 0 | |
| # Análise de distribuição angular | |
| angles = [line[0][1] for line in lines] | |
| angle_std = np.std(angles) | |
| if angle_std < 0.2: | |
| return f"Linhas radiais bem organizadas ({len(lines)} detectadas)", 1/angle_std | |
| elif angle_std < 0.4: | |
| return f"Linhas radiais moderadamente organizadas ({len(lines)} detectadas)", 1/angle_std | |
| else: | |
| return f"Linhas radiais irregulares ({len(lines)} detectadas)", 1/angle_std | |
| def comprehensive_analysis(self, image): | |
| """Realiza uma análise completa e detalhada da íris.""" | |
| try: | |
| enhanced, original = self._preprocess_image(image) | |
| results = [] | |
| for feature, analysis_func in self.iris_features.items(): | |
| try: | |
| description, value = analysis_func(original, enhanced) | |
| results.append({ | |
| "feature": feature, | |
| "analysis": description, | |
| "value": float(value) if value is not None else 0 | |
| }) | |
| except Exception as e: | |
| print(f"Erro ao analisar '{feature}': {str(e)}") | |
| continue | |
| # Formatação avançada dos resultados | |
| formatted_results = "Análise Detalhada de Iridologia (Versão Avançada):\n\n" | |
| for result in results: | |
| formatted_results += f"Característica: {result['feature']}\n" | |
| formatted_results += f"Análise: {result['analysis']}\n" | |
| if result['value'] > 0: | |
| formatted_results += f"Índice de complexidade: {result['value']:.2f}\n" | |
| formatted_results += "-" * 50 + "\n" | |
| return formatted_results | |
| except Exception as e: | |
| return f"Erro durante a análise: {str(e)}" | |
| def create_gradio_interface(): | |
| analyzer = IridologyAnalyzer() | |
| def process_image(image): | |
| if image is None: | |
| return "Por favor, faça o upload de uma imagem." | |
| return analyzer.comprehensive_analysis(image) | |
| iface = gr.Interface( | |
| fn=process_image, | |
| inputs=gr.Image(type="numpy", label="Upload da Imagem do Olho"), | |
| outputs=gr.Textbox(label="Resultados da Análise Avançada", lines=20), | |
| title="Analisador de Iridologia Avançado com IA", | |
| description=""" | |
| Sistema avançado de análise de íris usando técnicas de processamento de imagem de última geração. | |
| Faça o upload de uma imagem clara do olho para análise detalhada. | |
| Recomendações para resultados otimizados: | |
| 1. Use imagens bem iluminadas e de alta resolução | |
| 2. Garanta que a íris esteja em foco perfeito | |
| 3. Evite reflexos e sombras | |
| 4. Enquadre apenas o olho na imagem, centralizando a íris | |
| """, | |
| examples=[], | |
| cache_examples=True | |
| ) | |
| return iface | |
| if __name__ == "__main__": | |
| iface = create_gradio_interface() | |
| iface.launch() |