[英]Cimg border reading
#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的新手,所以我不知道為什么會這樣想法和/或解決方案?
我在Windows 10操作系統上使用code::blocks
。
不知道“僅顯示邊界”是什么意思-代碼似乎正在嘗試為圖像中的每個像素計算sqrt( (left+right)^2 + (top+bottom)^2 )
越過邊界是0)。
問題是您每次在循環內都將imagenGris2
初始化為一個數字,然后嘗試像訪問圖像一樣對其進行訪問。 您應該刪除循環內的第一行,並在循環外將其替換為:
imagenGris2=(imagen.get_channel(0)+imagen.get_channel(1)+imagen.get_channel(2))/3;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.