首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cimg边界读取

Cimg边界读取
EN

Stack Overflow用户
提问于 2015-10-21 01:34:59
回答 1查看 224关注 0票数 0
代码语言:javascript
复制
#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

EN

回答 1

Stack Overflow用户

发布于 2015-12-01 02:11:10

  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;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33243181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档