Ex1:图像读取和显示以及像素操作
1079
输入图像
读取 1.bmp 文件,并用CImg.display()显示
代码如下:``` #include "CImg.h" using namespace cimg_library; int main() { //读取图片 CImg<unsigned char> img("2.bmp"); //显示图片 img.display("Ex1"); return 0; } ```
把1.bmp文件的白色区域变成红色,黑色区域变成绿色。
代码如下:#include "CImg.h" using namespace cimg_library; int main() { CImg<unsigned char> img("2.bmp"); cimg_forXY(img, x, y) { if(img(x,y,0) < 200 && img(x,y,1) < 200 && img(x,y,2) < 200) { img(x,y,0) = 0; img(x,y,1) = 255; img(x,y,2) = 0; } else if(img(x,y,0) >= 200 && img(x,y,1) >= 200 && img(x,y,2) >= 200) { img(x,y,0) = 255; img(x,y,1) = 0; img(x,y,2) = 0; } } img.display("Ex1"); return 0; }
在图上绘制一个圆形区域,圆心坐标(50,50),半径为30,填充颜色为蓝色。
代码如下:#include "CImg.h" #include <cmath> using namespace cimg_library; int main() { CImg<unsigned char> img(200, 200, 1, 3); img.fill(0); cimg_forXY(img, x, y) { //圆心为(50, 50) double x2 = pow(x-50, 2); double y2 = pow(y-50, 2); double distance = sqrt(x2+y2); if(distance <= 30.0) { // 半径为30 img(x, y, 0) = 0; img(x, y, 1) = 0; img(x, y, 2) = 255; } } img.display("Ex1"); return 0; }
在图上绘制一个圆形区域,圆心坐标(50,50),半径为3,填充颜色为黄色
代码如下:#include "CImg.h" #include <cmath> using namespace cimg_library; int main() { CImg<unsigned char> img(200, 200, 1, 3); img.fill(0); cimg_forXY(img, x, y) { //圆心为(50, 50) double x2 = pow(x-50, 2); double y2 = pow(y-50, 2); double distance = sqrt(x2+y2); if(distance <= 3.0) { // 半径为3 img(x, y, 0) = 255; img(x, y, 1) = 255; img(x, y, 2) = 0; } } img.display("Ex1"); return 0; }
思考
为什么第四步绘制的圆形区域形状效果不好?
答:因为用到的像素太少,分辨率不高,因此方块感明显,边缘锯齿明显,不圆润,不连续,因此形状不好,对比第三步的半径大小,因为第三步中半径大得多,因此圆形的外缘有更多的像素组成,看起来锯齿没那么明显,方块感也减少,因此方块越密集,给人的视觉效果就越平滑,越连续。