#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