#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;}我对"contorno“方法有问题,它建议只显示.bmp图像的边框,但它显示了一个黑色窗口,我是新使用CImg的,所以我不知道为什么会发生这种情况,有什么想法和/或解决方案吗?
我在Windows10操作系统上使用code::blocks。
发布于 2015-12-01 02:11:10
sqrt( (left+right)^2 + (top+bottom)^2 ) (并假设超过边界的任何值都为0)。imagenGris2初始化为一个数字,然后尝试访问它,就好像它是一个图像一样。您应该删除循环内的第一行,并在循环外将其替换为:imagenGris2=(imagen.get_channel(0)+imagen.get_channel(1)+imagen.get_channel(2))/3;
https://stackoverflow.com/questions/33243181
复制相似问题