Biblioteca C++ de código abierto para el procesamiento de imágenes
Aplique filtros de imagen, cree, manipule y renderice formatos de archivo de imágenes populares utilizando la API gratuita de C++.
CImg Biblioteca es una biblioteca de fuentes abiertas que proporciona características útiles para la carga, el ahorro, la visualización y procesamiento de diversos tipos de imágenes dentro de C++ aplicaciones. El CImg es una biblioteca muy ligera y fácil de usar. Lo bueno es que evita manipular dependencias complejas y problemas de compatibilidad con la biblioteca. Está hecho de un único archivo de cabecera CImg.h que debe ser incluido en su fuente C++ . Ayuda a los desarrolladores realizando actividades complejas de procesamiento de imágenes en unas pocas líneas de código.
El API admite características avanzadas como el manejo de imágenes 3D, Transformación de imágenes, filtrado de imágenes, animación de imagen, Binarización de imágenes, y más. CImg biblioteca es muy portable autónoma. Se puede utilizar fácilmente en diferentes sistemas operativos con facilidad. Además, es también muy compatible con em numerous C++ compiladores como /em Visual C++, CC, G, etc.
Primeros pasos con CImg
La CImg Biblioteca está disponible como paquete .zip que es independiente de la plataforma. Contiene todos los archivos requeridos, junto con varios ejemplos, que muestran cómo utilizar las funciones y clases de la biblioteca.
Debe agregar estas dos líneas en su código fuente de C++ para poder trabajar con CImg.
Agregue estas líneas para que CImg funcione
#include "CImg.h"
using namespace cimg_library
Obtener la última versión de CImg vía Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
API de C++ para crear y modificar imágenes
La biblioteca de código abierto CImg permite a los desarrolladores de C++ crear y manipular diferentes tipos de imágenes dentro de sus propias aplicaciones. También admite cómo manejar la visualización de imágenes y los eventos del mouse. En primer lugar, debe incluir los archivos de encabezado principales y únicos de la biblioteca CImg. Lo bueno es que la biblioteca reduce la carga del desarrollador al permitirles escribir una cantidad muy pequeña de código. Tenga en cuenta también que la fuente funcionará perfectamente en los sistemas UNIX y Windows.
Crear imagen a través de la biblioteca C++
#include "CImg.h"
using namespace cimg_library;
int main() {
CImg image("lena.jpg"), visu(500,400,1,3,0);
const unsigned char red[] = { 255,0,0 }, green[] = { 0,255,0 }, blue[] = { 0,0,255 };
image.blur(2.5);
CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
while (!main_disp.is_closed() && !draw_disp.is_closed()) {
main_disp.wait();
if (main_disp.button() && main_disp.mouse_y()>=0) {
const int y = main_disp.mouse_y();
visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.width()-1,y,0,0),red,1,1,0,255,0);
visu.draw_graph(image.get_crop(0,y,0,1,image.width()-1,y,0,1),green,1,1,0,255,0);
visu.draw_graph(image.get_crop(0,y,0,2,image.width()-1,y,0,2),blue,1,1,0,255,0).display(draw_disp);
}
}
return 0;
}
Soporte de filtrado de imágenes
La biblioteca CImg proporciona apoyo al proceso de filtrado de imágenes. A veces tenemos que recuperar información sobre imágenes y ahí es donde se utiliza comúnmente el filtrado de imágenes. El proceso de filtrado de imágenes es uno de los métodos más comunes para aplicar a las imágenes para recuperar la información. Sobre todo, los filtros se utilizan en la eliminación del ruido de la imagen, derivados de la imagen, mejora del borde de la imagen, análisis de la forma y más.
Aplicar filtrado de mensajería en C++ aplicaciones
void* item_fourier_filtering() {
const CImg img = CImg(data_milla,211,242,1,3).RGBtoYCbCr().channel(0).resize(256,256);
CImgList F = img.get_FFT();
cimglist_apply(F,shift)(img.width()/2,img.height()/2,0,0,2);
const CImg mag = ((F[0].get_pow(2) + F[1].get_pow(2)).sqrt() + 1).log().normalize(0,255);
CImgList visu(img,mag);
CImgDisplay disp(visu,"[#16] - Fourier Filtering (Click to set filter)");
CImg mask(img.width(),img.height(),1,1,1);
const unsigned char one[] = { 1 }, zero[] = { 0 }, white[] = { 255 };
int rmin = 0, rmax = 256;
while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
disp.wait();
const int
xm = disp.mouse_x()*2*img.width()/disp.width() - img.width(),
ym = disp.mouse_y()*img.height()/disp.height(),
x = xm - img.width()/2,
y = ym - img.height()/2;
if (disp.button() && xm>=0 && ym>=0) {
const int r = (int)std::max(0.0f,(float)std::sqrt((float)x*x + y*y) - 3);
if (disp.button()&1) rmax = r;
if (disp.button()&2) rmin = r;
if (rmin>=rmax) rmin = std::max(rmax - 1,0);
mask.fill(0).draw_circle(mag.width()/2,mag.height()/2,rmax,one).
draw_circle(mag.width()/2,mag.height()/2,rmin,zero);
CImgList nF(F);
cimglist_for(F,l) nF[l].mul(mask).shift(-img.width()/2,-img.height()/2,0,0,2);
visu[0] = nF.FFT(true)[0].normalize(0,255);
}
if (disp.is_resized()) disp.resize(disp.window_width(),disp.window_width()/2).display(visu);
visu[1] = mag.get_mul(mask).draw_text(5,5,"Freq Min/Max = %d / %d",white,zero,0.6f,13,(int)rmin,(int)rmax);
visu.display(disp);
}
return 0;
}