簡體   English   中英

Cimg邊框閱讀

[英]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

  1. 不知道“僅顯示邊界”是什么意思-代碼似乎正在嘗試為圖像中的每個像素計算sqrt( (left+right)^2 + (top+bottom)^2 )越過邊界是0)。

  2. 問題是您每次在循環內都將imagenGris2初始化為一個數字,然后嘗試像訪問圖像一樣對其進行訪問。 您應該刪除循環內的第一行,並在循環外將其替換為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM