1 PUCPR- Pontifícia Universidade Católica Do Paraná PPGIA- Programa de Pós-Graduação Em Informática Aplicada PROF. DR. JACQUES FACON LIMIARIZAÇÃO FUZZY BASEADA EM AGRUPAMENTOS FUZZY ATRAVÉS DA ESTIMATIVA DE DENSIDADES NORMAIS Resumo: O problema da limiarização é tratado neste artigo usando o algoritmo de agrupamentos fuzzy através da estimativa de densidades normais para providenciar particionamentos ótimos. Palavras-chave: Limiar, Fuzzy D-Normais, Densidades Normais, Objeto, Fundo, Distribuição Normal. 1. Introdução Este trabalho foi realizado através do estudo do método de limiarização de imagens por estimativa de densidades normais. Tal técnica consiste em encontrar o ponto ideal do histograma de uma imagem, para então aplicar a limiarização assumindo a distribuição normal de cinza do objeto e do fundo. Na seção 2 é comentada a teoria do algoritmo, a seção 3 descreve o algoritmo utilizado na implementação, a seção 4 apresenta a fonte do programa implementado, a seção 5 descreve as referências do estudo e a seção 6 conclui o trabalho. 2. Teoria do Algoritmo Limiarização em níveis de cinza é o processo do particionamento de pixels numa imagem digital dentro de duas regiões mutuamente exclusivas e exaustivas. Seja ϑ=[Imn]MxN que denota a imagem com pixel em (m,n) assumindo um discreto valor de cinza Imn ∈ {0,1,..L-1} definido sobre o universo L=[0,L-1]. O problema da limiarização é aquele que identifica um limiar ótimo T e segmenta o cenário em duas regiões principais – objeto (O) e fundo (B - background). O = {Imn | Imn ≥ T } B = {Imn | Imn < T} As características geométricas e estatísticas do histograma impõem uma importante regra na identificação do limiar. Limiarização é o método preferencial de segmentação quando objeto e fundo são distinguíveis utilizando somente valores de cinza. Em cada cenário a perturbação dos valores de cinza ao redor dos valores principais das distribuições de cinza do objeto e do fundo geram um histograma bimodal e o limiar T ∈ L é considerado tanto como o ponto entre os dois modos quanto para minimizar a probabilidade de erro de classificação. O algoritmo de estimativa de densidades normais trabalha com a distribuição normal de cinza do objeto e do fundo. Kittler e Illingworth [Kittler -- Illingworth (1986)] sugerem uma estratégia para a limiarização baseada nesta suposição: 2 J (t ) = t −1 j =0 + L −1 j =t pj j − v1 2 j − v2 2 + 2 log σ 1 − p j σ1 pj , (12) + 2 log σ 2 − p2 σ2 Considera-se que a mínima global de J minimiza a classificação de erro e melhora a limiarização correspondente. Em experimentos com ajuda das suposições normais, o algoritmo rende excelentes resultados ainda existindo a chance da identificação de uma falsa limiarização nos valores extremos de cinza em valores estreitos. O problema da seleção da limiarização na presença de regiões não balanceadas pode ser simplificado por uma grande extensão se for possível alterar a geometria dos valores de cinza. Assim o limiar absoluto será eqüidistante de ambas as regiões. Isto pode ser feito definindo uma medida de distância associada a cada uma das classes. Para tanto são definidas funções para pseudodistâncias: 1 j − vi d ( j, vi ) = 2 σi 2 + log σ i − log β i , (13) onde σi e βi são dados por: L −1 βi = i =0 µ iT ( j )h j L −1 µ T ( j )h j + i =0 0 L −1 σi = i =0 L −1 µ T ( j )h j i =0 B µ iT ( j )h j ( j − v i ) 2 L −1 µ T ( j )h j i =0 i , (14) , (15) Note-se que βi é sempre menor ou igual a 1 e βi relaciona-se com ρ no caso de uma partição difícil como β i = 1/(ρ+1) , β2 = 1/(ρ+1). Com esta distância medida, um valor de cinza com igual densidade no objeto e no fundo será mapeado como eqüidistante de ambas as metades da região. 3. Algoritmo 1. Inicialize a descrição limiar µ0 e µb satisfazendo a equação (6): µ i ( x j ) ∈ [0,1] (6a) 0< n j =1 c i =1 2. µ i ( x j ) = 1. 0 ( 6c ) ompute os valores medianos de ambas as regiões usando a equação (9): L −1 vi = 3. µ i ( x j ) < n (6b) j =0 h j jµ i ( j ) T L −1 h µ ( j)T j =0 j i , i = 1,2 , (9) Compute βi e σi , i=1,2.. usando as equações (14) e (15). 3 4. Melhore os membros usando a equação (10) cujo valor é um parâmetro da função, equação (13) µ 0 ( j) = 5. 1 , (10a) 1 + [d ( j , v 0 ) / d ( j , v B )] 2 /(T −1) µ B ( j ) = 1 − µ 0 ( j ) , (10b) Repita os passos 2 a 5 até não mais haver alterações de µo para µb. 4 Conclusões Percebe-se que o algoritmo de limiarização fuzzy através da estimativa das densidades normais melhora a binarização da imagem de acordo com o coeficiente utilizado. Além disso o algoritmo é capaz de identificar falsos limiares em imagens muito borradas. Algumas dificuldades foram encontradas na implementação do algoritmo, principalmente durante o cálculo das pseudo-distâncias, que dependem de beta e sigma-quadrado, que devem ser diferentes de zero. 5 Referências C. V. Jawahar. P. K. Biswas and K. Ray, “Investigations On Fuzzy Thresholding Based On Fuzzy Clustering”, Pattern Recognition, Vol. 30, No. 10, pp. 1605-1613, 1997. 4 IMPLEMENTAÇÃO: // Algoritmo de Limiarizacao Fuzzy Densidades Normais BOOL CLimiar::LimiarFuzzyDNormais() { const double Tal = GetTal_FuzzyDNormais(); long j,g; double double double double double double double numb,denb,nusb,mb[256]; // Numerador, Denominador e MI (Background) numo,deno,nuso,mo[256]; // Numerador, Denominador e MI (Object) aux,expoente; vb,vbaux,pdb; vo,voaux,pdo; sigmab,betab,logauxb,distb; sigmao,betao,logauxo,disto; long BYTE Iteracoes; Limiar; if ( !(VerifyConsistentIn() && VerifyConsistentOut()) ) return FALSE; CopyImageInOut(); ClockStart(); Histograma(); // Zerando mb e mo for(g=0;g<256;g++) { mb[g] = 0; mo[g] = 0; } // calculo de mb numb = 0; denb = 0; for (g=0;g<256;g++) { numb += g*m_Histo[g]; denb += m_Histo[g]; } if (denb == 0) mb[g] = 0; else mb[g] = numb / denb; // calculo de mo numo = 0; deno = 0; for (g=256-2;g>=0;g--) { numo += (g+1)*m_Histo[g+1]; deno += m_Histo[g+1]; if (deno == 0) mo[g] = 0; else mo[g] = numo / deno; 5 } // Manipulacao para mb(xj) pertenca [0,1] e mo(xj) pertenca [0,1] for (j=0;j<256;j++) { aux = mb[j] + mo[j]; mb[j] = mb[j] / aux; mo[j] = mo[j] / aux; } // Vale lembrar mb(xj) + mo(xj) para j de 0 ate L-1 deve ser igual a 1 // Esta condicao e valida porem existe uma margem de erro minima // que deve ser desconsiderada expoente = (2 / (Tal - 1) ); vb = 0; vo = 0; Iteracoes=0; // loop entre equacoes 9 e 10 while(1) { Iteracoes++; // Calculo de vb e vo numb = 0; denb = 0; numo = 0; deno = 0; for(j=0;j<256;j++) { numb += m_Histo[j]*j*pow(mb[j],Tal); denb += m_Histo[j] *pow(mb[j],Tal); } numo += m_Histo[j]*j*pow(mo[j],Tal); deno += m_Histo[j] *pow(mo[j],Tal); vbaux = numb / denb; voaux = numo / deno; Limiar = (BYTE) ((vbaux + voaux) / 2); if ( (fabs(vbaux - vb) < .01) && (fabs(voaux - vo) < .01) ) break; vb = vbaux; vo = voaux; // Calculo de beta e sigma_quadrado nusb = 0;nuso = 0; for(j=0;j<256;j++) { nusb += pow(m_Histo[(int)(fabs(j-vb))],2)*pow(mb[j],Tal); nuso += pow(m_Histo[(int)(fabs(j-vo))],2)*pow(mo[j],Tal); } if ( (nusb == 0) || (nuso == 0) || (1000*nusb < nuso) || (1000*nuso < nusb) ) break; betab = denb / (deno + denb); betao = deno / (deno + denb); 6 sigmab = pow( nusb / denb, .5); sigmao = pow( nuso / deno, .5); // Variável auxiliar logaritmica logauxb = log10(sigmab) - log10(betab); logauxo = log10(sigmao) - log10(betao); for(j=0;j<256;j++) { //d(j,vi) - pseudo-distâncias distb = .5 * pow((j-vb)/sigmab,2) + logauxb; disto = .5 * pow((j-vo)/sigmao,2) + logauxo; pdb = pow( distb, expoente ); pdo = pow( disto, expoente ); } } mb[j] = pdo / (pdo + pdb); mo[j] = pdb / (pdo + pdb); SetIteracoes((DWORD)Iteracoes); SetLimiar((BYTE)Limiar); AplicarLimiar(); ClockFinish("Limiarizacao Fuzzy Densidades Normais"); } return TRUE;