Processamento de Imagem

Boa noite pessoal,

Estou desenvolvendo uma ferramenta que detecta a taxa de nudez em uma imagem.

Entretanto, estou com um problema de lógica, como faria pra verificar se a quantidade de pele amostra é maior que 70%.

Segue abaixo o código:

public void Filtro(ImageProcessor saida){
        ImagePlus objIplus = new ImagePlus(null, saida);
        ImageProcessor imp = objIplus.getProcessor();
        int nAlt   = objIplus.getProcessor().getHeight();
        int nLarg  = objIplus.getProcessor().getWidth();
        int nVerm  = 0;
        int nAzul  = 0;
        int nVerde = 0;
        int nMin   = 0;
        int nMax   = 0;
        int nCont  = 0;
        int nMedia = 0;
        int nPixel = 0;
        int nAux = 0;
 
        int[] rgb = new int[3];
        int[] cor1 = new int[]{0, 0, 0};      //Preto
        int[] cor2 = new int[]{264, 82, 108}; //Vermelho
        int[] cor3 = new int[]{79,106,143};   //Azul
        
        for(int i = 0; i < nLarg; i++){
            for(int j = 0; j < nAlt; j++){
                
                nMin = (int) imp.minValue();
                nMax = (int) imp.maxValue();
                
                imp.getPixel(i,j,rgb);
                
                nVerm  = rgb[0];
                nVerde = rgb[1];
                nAzul  = rgb[2];
                
                nMedia = (nVerm+nVerde+nAzul)/3;
                
                //Se for negra
                if((nVerm >= 109 && nVerm <= 203) && (nVerde >= 92 && nVerde <= 147) && (nAzul >= 78 && nAzul <= 123)){
                   imp.putPixel(i, j, cor2);    
                   nCont++;
                   //JOptionPane.showMessageDialog(rootPane, "Pixel:["+i+"]["+j+"]  é pele/ Vermelho"+nVerm+"/Verde"+nVerde+"/Azul"+nAzul);
                }else if((nVerm >= 115 && nVerm <= 160) && (nVerde >= 39 && nVerde <= 84) && (nAzul >= 20 && nAzul <= 65)){
                   imp.putPixel(i, j, cor2);
                   nCont++;
                }else if((nVerm >= 207 && nVerm <= 252) && (nVerde >= 129 && nVerde <= 174) && (nAzul >= 83 && nAzul <= 128)){
                    imp.putPixel(i, j, cor2);
                    nCont++;
                }else if((nVerm >= 97 && nVerm <= 143) && (nVerde >= 41  && nVerde <= 86) && (nAzul >= 25 && nAzul <= 70)){
                    imp.putPixel(i, j, cor2);
                    nCont++;
                }else if((nVerm >= 204 && nVerm <= 209) && (nVerde >= 141 && nVerde <= 186) && (nAzul >= 108 && nAzul <= 153)){
                    imp.putPixel(i, j, cor2);
                    nCont++;
                }else if((nVerm >= 170 && nVerm <= 215) && (nVerde >= 131 && nVerde <= 176) && (nAzul >= 123 && nAzul <= 168)){
                    imp.putPixel(i, j, cor2);
                    nCont++;
                }else if((nVerm >= 188 && nVerm <= 233) && (nVerde >= 173 && nVerde <= 216) && (nAzul >= 173 && nAzul <= 218)){
                    imp.putPixel(i, j, cor2);
                    nCont++;
                }else if((nVerm >= 200 && nVerm <= 245) && (nVerde >= 195 && nVerde <= 240) && (nAzul >= 210 && nAzul <= 255)){
                    imp.putPixel(i, j, cor2);
                    nCont++;
                }else{
                    nAux++;
                }

                nPixel++;
            }
        }
        
        int nPorcImg = 0;
        int nPorcAcei = 0;
        String cMsg;
        int nNaoPele = nAux;
        int nPele = 0;  
        
        //Pega quantidade de pixel pintado
        nPele  = nCont;
        
        //nPorcAcei = (nPorcImg-((nPele*70)/100)); 
        
       
        //A partir daqui não sei como proceder
        if (nCont < nPorcAcei) {
            cMsg = "é menor que 70%";
        } else {
            cMsg = "ta nua";
        }
        //int nTot = (nCont*70)/100;
        
        JOptionPane.showMessageDialog(rootPane, cMsg);
    }
    
    public void Suavizar(){
        imgSaida = img.duplicate();
        
        //Equalização
         ContrastEnhancer c = new ContrastEnhancer();
         c.equalize(imgSaida);       
         exibeImagemProcessada(imgSaida, lblimagem);

    }

Agradeço desde já.

Partindo do pressuposto que seu detector de peles já funciona, e que nCont contém a quantidade de pixels de pele, e “pixels” contém a quantidade total de pixels, o percentual pode ser calculado por:

Eu modificaria um pouco esse algoritmo:

[code]public boolean inRange(int value, int min, int max) {
return value >= min && value <= max);
}

public void detectaPele(ImageProcessor saida){
ImageProcessor imp = new ImagePlus(null, saida).getProcessor();

final int[] VERMELHO = new int[]{264, 82, 108}; //Vermelho
int nCont = 0;

for(int i = 0; i &lt; imp.getWidth(); i++){
    for(int j = 0; j &lt; imp.getHeight(); j++){
        int[] rgb = new int[3];
        imp.getPixel(i,j,rgb);
            
        int r  = rgb[0];
        int g = rgb[1];
        int b  = rgb[2];
            
        if (
            inRange(r, 109, 203) && inRange(g, 92, 147) && inRange(b, 78, 123) ||
            inRange(r, 115, 160) && inRange(g, 39, 84) && inRange(b, 20, 65) ||
            inRange(r, 207, 252) && inRange(g, 129, 174) && inRange(b, 83, 128) ||
            inRange(r, 97, 143) && inRange(g, 41, 86) && inRange(b, 25, 70) ||
            inRange(r, 204, 209) && inRange(g, 141, 186) && inRange(b, 108, 153) ||
            inRange(r, 270, 215) && inRange(g, 131, 176) && inRange(b, 123, 168) ||
            inRange(r, 188, 233) && inRange(g, 173, 216) && inRange(b, 173, 218) ||
            inRange(r, 200, 245) && inRange(g, 195, 240) && inRange(b, 210, 255)
        ) {
                imp.putPixel(i, j, VERMELHO);
                nCont++;
        }
    }
}

double taxaPele = (double)nCont / (imp.getWidth() * imp.getHeight());
cMsg = taxaPele &lt; 0.7 ?  &quot;é menor que 70%&quot; : &quot;ta nua&quot;;
JOptionPane.showMessageDialog(rootPane, cMsg);

}[/code]

Assim fica mais limpo e mais fácil de entender.