你的浏览器不支持canvas

我们笑着说再见,却深知再见遥遥无期。

计算机视觉hw1

Date: Author: JX

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自JX的博客

图像读取和显示以及像素操作

要求

  1. 读取 1.bmp 文件,并用 CImg.display() 显示

代码

#include "CImg/CImg.h"
using namespace cimg_library;

void showbmp()

{

CImg<unsigned char> image;
image.load_bmp("1.bmp");
image.display();

}

int main() {

    showbmp();
    return 0;
}

解释:

编译需要加参数 -O2 -lgdi32 表示优化第二级别 -lgdi32是windows的一个动态库(暂时不知道作用)

  1. 把 1.bmp 文件的白色区域变成红色,黑色区域变成绿色

代码

void changeColor() {
        
    CImg<unsigned char> img("t.bmp");
    cimg_forXY(img, x, y) {
        if(img(x,y,0) == 255 && img(x,y,1) == 255 && img(x,y,2) == 255) {
            img(x,y,0) = 255;
            img(x,y,1) = 0;
            img(x,y,2) = 0;
        }
        else if(img(x,y,0) == 0 && img(x,y,1) == 0 && img(x,y,2) == 0) {
            img(x,y,0) = 0;
            img(x,y,1) = 255;
            img(x,y,2) = 0;
        }
    }
    img.display("2");
}

解释:

这里使用cimg_forXY方法,是c++的宏用法。 这个宏定义如下: Cimg宏

  1. 在图上绘制一个圆形区域,圆心坐标(50,50),半径为 30,填充颜色为蓝色。
  2. 在图上绘制一个圆形区域,圆心坐标(50,50),半径为 3,填充颜色为黄色。

代码

void yuan3() {
    CImg<unsigned char> img("t.bmp");
    cimg_forXY(img, x, y) {
        double x2 = pow(x-50, 2);
        double y2 = pow(y-50, 2);
        double distance = sqrt(x2+y2);
        // 只需要改变这里的代码就可以完成3或者4
        if(distance <= 30.0) {
            img(x, y, 0) = 0;
            img(x, y, 1) = 0;
            img(x, y, 2) = 255;
        }
    }
    img.display("3");
}

思考:

  1. 为什么第四步绘制的圆形区域形状效果不好

    半径太小,图像的像素不高,在这个半径中的像素点少所以颗粒感明显,边缘难以平滑。


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。