2015-10-20 2 views
0
#include "CImg.h" 
#include <iostream> 
#include <string> 
#include <sstream> 
#include<math.h> 

using namespace std; 
using namespace cimg_library; 

class Imagen{ 
public: 

CImg<int> contorno(char[60]); 
CImg<int> binarizar(char[60],int); 
CImg<int> grises(char[60]);}; 

CImg<int> Imagen::binarizar(char nombreImagen[60],int factorB){ 
CImg<int> imagen(nombreImagen); 
unsigned char r,g,b,promedio; 
CImg<int> imagenB(imagen.width(),imagen.height(),1,1); 
for(int x=0;x<imagenB.width();x++){ 
    for(int y=0;y<imagenB.height();y++){ 
      r=imagen(x,y,0,0); 
      g=imagen(x,y,0,1); 
      b=imagen(x,y,0,2); 
      promedio=((r+g+b)/3); 

      if(promedio>=factorB) 
       imagenB(x,y,0,0)=255; 

      if(promedio<=factorB) 
       imagenB(x,y,0,0)=0; 

    }} 

return imagenB;} 

CImg<int> Imagen::grises(char nombreImagen[60]){ 
CImg<int> imagen(nombreImagen); 
CImg<int> imagenG(imagen.width(),imagen.height(),1); 
cimg_forXYC(imagen,x,y,c) { 
    imagenG(x,y,0)= (imagen(x,y,0)+imagen(x,y,1)+imagen(x,y,2))/3; 
} 
return imagenG;} 

CImg<int> Imagen::Contorno(char nombreImagen[60]){ 
CImg<int>imagen(nombreImagen); 
CImg<int>imagenCont(imagen.width(),imagen.height(),1); 
CImg<int>imagenGris2(imagen.width(),imagen.height(),1); 
int a,b,c,d; 
for(int x=0;x<imagen.width();x++){ 
    for(int y=0;y<imagen.height();y++){ 
      imagenGris2=(imagen(x,y,0)+imagen(x,y,1)+imagen(x,y,2))/3; 
      a = imagenGris2(x,y,0); 
      b = -imagenGris2(x+1,y+1,0); 
      c = imagenGris2(x+1,y,0); 
      d = -imagenGris2(x,y+1,0); 
     imagenCont(x,y,0) = (sqrt(pow((a+b),2)+pow((c+d),2))); 


    } 
} 
return imagenCont; } 

int main() { 

Imagen img; 
char nomImg [60]; 
int opcion, factorBinarizar; 
cout<<"ñññ."<<endl<<endl; 
cout<<"Manipulacion de Imagenes Basica."<<endl<<endl; 
cout<<"Ingrese el nombre de la imagen: "<<endl; 
cin>>nomImg; 

do{ 
    CImg<int> nvaImagenGris, nvaImagenBin, nvaImagenCont; 
    cout<<"Seleccione una opcion:"<<endl<<endl<<"[1].visualizar escala de grises.\n[2].Visualizar la imagen binarizada.\n[3].Visualizar contornos de la imagen.\n[4].Guardar las imagenes y salir.\n"; 
    cin>>opcion; 

    switch(opcion){ 
     case 1:nvaImagenGris=img.grises(nomImg);break; 
     case 2: 
      cout<<"Ingrese el numero factor de binarizacion:"<<endl; 
      cin>>factorBinarizar; 
      nvaImagenBin=img.binarizar(nomImg,factorBinarizar); 
      break; 
     case 3: 
      nvaImagenCont=img.Contorno(nomImg); 
      break; 
     case 4: 
      nvaImagenGris.save("ImModGris.bmp"); 
      nvaImagenBin.save("ImModBin.bmp"); 
      nvaImagenCont.save("ImModCont.bmp"); 
     break; 
     default: 
      cout<<"opcion incorrecta"<<endl; 
     break; 
    } 
    if(opcion==1){ 
     CImgDisplay ventana(nvaImagenGris, "Imagen grises",1); 
     ventana.wait(3000);} 
     else if (opcion==2){ 
     CImgDisplay ventaNa(nvaImagenBin, "Imaen Binarizada",1); 
     ventaNa.wait(3000);} 
     else if (opcion==3){ 
     CImgDisplay ventanA(nvaImagenCont,"Contorno de la Imagen",1); 
     ventanA.wait(3000);} 

}while(opcion != 4); 
return 0;} 

J'ai des problèmes avec la méthode « contorno », il est suposed pour ne montrer que de frontières d'une image .bmp, mais il me montre une fenêtre noire, je suis nouveau à l'aide CImg donc je don ne sais pas pourquoi cela se passe, aucune idée et/ou solution pour cela? J'utilise code::blocks sur un OS 10 Windows.frontière Cimg lecture

Répondre

0
  1. Je ne sais pas ce que vous entendez par « montrer que les frontières » - le code semble essayer de calculer sqrt((left+right)^2 + (top+bottom)^2) pour chaque pixel de l'image (et suppose quoi que ce soit au-delà des frontières est 0). Le problème est que vous initialisez imagenGris2 à un nombre unique à chaque fois dans la boucle, puis essayez d'y accéder comme s'il s'agissait d'une image. Vous devez supprimer la première ligne dans la boucle et en dehors de la boucle remplacer par:

imagenGris2=(imagen.get_channel(0)+imagen.get_channel(1)+imagen.get_channel(2))/3;