继openCV之后接触的又一个C++视觉库——短小精干的CImg
刚开始接触的时候真的是..几乎无从下手,网上资料比较少,但发现有一篇非常有用的中文手册:http://wenku.baidu.com/link?url=GKEgUZUzabHADgCQG3Dg5NGzaMevXu38vvHF71UB339zZJVLaqYWCrPQfmNV7Y0gYMb340wVNK9fJ7Zu0H54Hchi8UwKI3yCQlCnVcoC8mK
再加上,CImg本身的代码并不是很多,也容易理解,最关键的是,源码里注释写得很明白,所以打开源码,ctrl+F来学习也非常不错。
这里记录一下CImg的一些基本的像素操作
————————————————我是一条分割线—————————————————————
主要是这几个:
(x, y分别表示在横纵轴上的坐标,(0,0)在左上角, z = 1时,表示2D图像, c 表示通道数)
//存取(x, y)处,z通道的值, 若X小于0,则取值为零,若x大于width,则取值width-1处,最后存取(x, y, z, c)的值
T& atX(int x, int y, int z, int c)
//存取(x, y)处,z通道的值 ,防止X、Y超出范围,若是超出范围则取边界值,最后存取(x, y, z, c)的值
T& atXY(int x, int y, intz, int c)
//存取(x, y)处,z通道的值 ,防止X、Y、Z超出范围,同上
T& atXYZ(int x, int y, int z, int c)
//存取(x, y)处,z通道的值 ,防止X、Y、Z、C超出范围, 同上
T& atXYZC(int x, int y, int z, int c)
//存取(x, y)处,z通道的值 , 若X超出范围,则返回out_value
T& atX(int x, int y, int z, int c, const T& out_value)
//存取(x, y)处,z通道的值 , 若(X超出范围 || y超出范围),则返回out_value
T& atXY(int x, int y, intz, int c, const T& out_value)
//存取(x, y)处,z通道的值 ,若(X超出范围 || y超出范围 || z超出范围),则返回out_value
T& atXYZ(int x, int y, int z, int c, const T& out_value)
//存取(x, y)处,z通道的值 ,若(X超出范围 || y超出范围 || Z超出范围 || C超出范围),则返回out_value
T& atXYZC(int x, int y, int z, int c, const T& out_value)
编译指令:
g++ -o test.exe test.cpp -O2 -L/usr/X11R6/lib -lm -lpthread -lX11
运行:
./test.exe
code:
1 #include <iostream> 2 #include "CImg.h" 3 4 using namespace cimg_library; 5 using namespace std; 6 7 int main(int argc, char* argv[]) { 8 9 CImg<unsigned char> testImage1("images/image3.bmp"); 10 CImg<unsigned char> testImage2(testImage1.width(), testImage1.height(), 1, 3); 11 for (int i = 0; i < testImage1.width(); i ++) 12 for (int j = 0; j < testImage1.height(); j ++) 13 for (int k = 0; k < 3; k ++) 14 testImage2.atXYZC(i, j, 1, k) = testImage1.atXYZC(i, j, 1, k); 15 testImage2.display("COPY"); 16 return 0; 17 }