计算机视觉实验报告(EX1)

17343001 艾鹤轩

Ex1:图像读取和显示以及像素操作
参考博客:https://blog.csdn.net/marvelgl/article/details/58596637
参考github:https://github.com/WangPerryWPY/Computer-Version
前言
输入图像:

  1. 读入 1.bmp 文件,并用 CImg.display() 显示。
#include "CImg.h"
using namespace cimg_library;
int main() {
	CImg  SrcImg;
	SrcImg.load_bmp("1.bmp");
	SrcImg.display("hw1");
	return 0;
}

计算机视觉实验报告(EX1)_第1张图片
这里我们需要注意,我们要提前将所用的图片加入项目之中,同时使用老师给我们提供的CImg库。

  1. 把 1.bmp 文件的白色区域变成红色,黑色区域变成绿色。
void Display::change() {
	//the color white to red.
	//white(255,255,255)->red(255,0,0)
	cimg_forXY(SrcImg, x, y) {
		if (SrcImg(x, y, 0) == 255 && SrcImg(x, y, 1) == 255 && SrcImg(x, y, 2) == 255) {
			SrcImg(x, y, 0) = 255;
			SrcImg(x, y, 1) = 0;
			SrcImg(x, y, 2) = 0;
		}
	}
	//the color black to green
	//black(0,0,0)->green(0,255,0)
	//more color please search the RGB list.
	cimg_forXY(SrcImg, x, y) {
		if (SrcImg(x, y, 0) == 0 && SrcImg(x, y, 1) == 0 && SrcImg(x, y, 2) == 0) {
			SrcImg(x, y, 0) = 0;
			SrcImg(x, y, 1) = 255;
			SrcImg(x, y, 2) = 0;
		}
	}
}

计算机视觉实验报告(EX1)_第2张图片
3. 在图上绘制一个等边三角形区域, 其中心坐标(50,50), 边长为 40,填充颜色为蓝色。

void Display::Draw_Triangle() {
		cimg_forXY(SrcImg, x, y) {
			if (y > 50-20*sqrt(3)/3 && y < 50+40*sqrt(3)/3){
				if (x > (y + 110 * sqrt(3) / 3 - 50) / sqrt(3) && x < (y - 190 * sqrt(3) / 3 - 50) / (-1 * sqrt(3))) {

					SrcImg(x, y, 0) = 0;
					SrcImg(x, y, 1) = 0;
					SrcImg(x, y, 2) = 255;
				}
			}
		}
}

计算机视觉实验报告(EX1)_第3张图片
4. 在图上绘制一个圆形区域,圆心坐标(50,50),半径为 15,填充颜色为黄色。

void Display::DrawCircle_yellow1() {
	cimg_forXY(SrcImg, x, y) {
		if (pow(pow(x - 50, 2) + pow(y - 50, 2), 0.5) < 15) {
			SrcImg(x, y, 0) = 200;
			SrcImg(x, y, 1) = 155;
			SrcImg(x, y, 2) = 0;
		}
	}
}

计算机视觉实验报告(EX1)_第4张图片
5. 在图上绘制一条长为 100 的直线段, 起点坐标为(0, 0), 方向角为 135 度, 直线的颜色为绿色。

void Display::DrawLine1() {
	double x0 = 100 * cos(45 * PI / 180);
	double y0 = 100 * sin(45 * PI / 180);
	cimg_forXY(SrcImg, x, y) {
		if (x == 0) {
			if (y == 0) {
				SrcImg(x, y, 0) = 0;
				SrcImg(x, y, 1) = 255;
				SrcImg(x, y, 2) = 0;
			}
		}
		else {
			if (cmp((double)y, (double)x*tan(45 * PI / 180)) && (double)x <= x0 && (double)y <= y0) {
				SrcImg(x, y, 0) = 0;
				SrcImg(x, y, 1) = 255;
				SrcImg(x, y, 2) = 0;
			}
		}
	}
}

计算机视觉实验报告(EX1)_第5张图片
6. 把上面的操作结果保存为 2.bmp。
main函数:使用temp.save.因为要保存2.bmp。所以这里有:

int main(int argc, char *argv[]) {
	Display pic;
	Display pic1;
	CImg temp = pic.getSrcImg();
	temp.save("1.bmp");
	CImgtemp1 = pic1.getSrcImg();
	temp.save("2.bmp");

	return 0;
}

计算机视觉实验报告(EX1)_第6张图片
对于上面的第三、 四、五步, 先不用 CImg 的函数调用,绘制出相应的图形。然后再调用 CImg相关函数绘制出相应的图形。 并在实验文档中对比两者的差异。
第三步:三角形
未使用接口函数:

void Display::Draw_Triangle2() {
	unsigned char blue[] = { 0,0,255 };
	SrcImg.draw_circle(50, 50, 40, blue);
}

第四步:圆形

void Display::DrawCircle_yellow2() {
	unsigned char yellow[] = { 200, 155, 0 };
	SrcImg.draw_circle(50, 50, 15, yellow);
}

第五步:线

void Display::DrawLine2() {
	unsigned char green[] = { 0,255,0 };
	SrcImg.draw_line(0,0,100*cos(45*PI/180),100*sin(45*PI/180),green);
}

把上述功能代码写成类的形式,把上面的第三、 四、五步操作封装为该类的操作。

int main(int argc, char *argv[]) {
	Display pic;
	Display pic1;
	pic.change();
	pic.Draw_Triangle();
	pic.DrawCircle_yellow1();
	pic.DrawLine1();
	pic.DrawLine2();
	pic.Todisplay();
	CImg temp = pic.getSrcImg();
	temp.save("1.bmp");
	pic1.change();
	pic1.Draw_Triangle();
	pic1.DrawCircle_yellow1();
	pic1.DrawLine1();
	pic1.DrawLine2();
	pic1.Todisplay();
	CImgtemp1 = pic1.getSrcImg();
	temp.save("2.bmp");

	return 0;

**思考:

  1. 为什么第四步绘制的圆形区域形状效果不好。**
    图像处理方式的问题。因为是用采样处理的方式,在遍历像素点时去掉了整数值。。后面的图像范围较小,像素点采集的个数会不足,通过人眼所观察到的则更加不同。误差增大。

你可能感兴趣的:(人工智能科学)