美文网首页
计算机图形图像技术-复习参考题代码部分答案

计算机图形图像技术-复习参考题代码部分答案

作者: Aris_TnT | 来源:发表于2019-07-07 10:33 被阅读0次

    前言

    环境:Clion + OpenGL + OpenCV

    按照书中代码进行复现或改造。若有错误,为保证即时性,请在博客文章下方留言,会及时更正。

    最新更正结果以博客文章内为准:Aris_Blog:计算机图形图像技术-复习参考题代码部分答案

    Edited by Aris. Last edited on July 6, 2019

    OpenGL

    T3

    题目:请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于显示一个填充的白色矩形。其中矩形规定为(-0.8, -0.8)~(0.8, 0.8),程序窗口的大小为(200, 200),标题为“白色矩形”。

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT);// 初始化颜色缓冲区
        // glColor3f(1, 0, 0); // 设置颜色为红色
        glRectf(-0.8, -0.8, 0.8, 0.8);
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("白色矩形"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T4

    题目:请使用 OpenGL 和 GLUT 编写一个简单的图形程序,用于显示一个填充的红色三角形。其中三角形的顶点分别是(-0.8, -0.8)、(0.8, -0.8)和(0, 0.8),程序窗口大小为(200, 200),标题为“红色三角形”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
        glColor3f(1, 0, 0); // 设置颜色为红色 (R, G, B)
        glBegin(GL_TRIANGLES); // 三角形
        glVertex2d(-0.8, -0.8); // 顺时针方向指定三顶点坐标,连线
        glVertex2d(0.8, -0.8);
        glVertex2d(0, 0.8);
        glEnd(); // 三角形定义结束
        glFlush();// 线段定义结束
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("红色三角形"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T5

    题目:请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的蓝色平行四边形。其中平行四边形的4个顶点分别是(-0.9, -0.4)、(0.4, -0.4)、(0.9, 0.4)和(-0.4, 0.4),程序窗口的大小为(300, 300),标题为“蓝色平行四边形”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
        glColor3f(0, 0, 1); // 设置颜色为蓝色 (R, G, B)
        glBegin(GL_QUADS); // 四边形
        glVertex2d(-0.9, -0.4); // 顺时针方向指定四顶点坐标,连线
        glVertex2d(0.4, -0.4);
        glVertex2d(0.9, 0.4);
        glVertex2d(-0.4, 0.4);
        glEnd(); // 定义结束
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("蓝色平行四边形"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T6

    题目:请使用OpenGL和GLUT编写一个简单的图形程序,用于显示一个填充的紫色梯形。其中梯形的4个顶点分别是(-0.9, -0.4)、(0.4, -0.4)、(0.4, 0.4)和(-0.4, 0.4),程序窗口的大小为(300, 300),标题为“紫色梯形”。

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
        glColor3f(1, 0, 1); // 设置颜色为紫色 (R, G, B)
        glBegin(GL_QUADS); // 四边形
        glVertex2d(-0.9, -0.4); // 顺时针方向指定四顶点坐标,连线
        glVertex2d(0.4, -0.4);
        glVertex2d(0.4, 0.4);
        glVertex2d(-0.4, 0.4);
        glEnd(); // 定义结束
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("紫色梯形"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T29

    题目:请使用 OpenGL、GLU 和 GLUT 编写一个显示线框立方体的程序。其中立方体的半径为 1.5 单位,并首先绕(0, 0, 0)~(1, 1, 0)旋转 30 度,然后远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“线框立方体”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    
        glLoadIdentity(); // 初始化矩阵
        gluPerspective(30, 1, 1, 100); // 视角
    
        // 按照题意顺序写的,实际情况下面两行调换才能看到立方体
        glRotated(30, 1, 1, 0); // 绕(0, 0, 0)~(1, 1, 0)旋转 30 度
        glTranslated(0, 0, -6.5); // 远移 6.5 单位
    
        glutWireCube(1.5); //线框体,半径为 1.5 单位
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("线框立方体"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T30

    题目:请使用 OpenGL、GLU 和 GLUT 编写一个三维犹他茶壶程序。其中茶壶的半径为 1 单位,并远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“尤他茶壶”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    
        glLoadIdentity(); // 初始化矩阵
        gluPerspective(30, 1, 1, 100); // 视角
        glTranslated(0, 0, -6.5); // 远移 6.5 单位
        glutSolidTeapot(1); // 尤他茶壶,半径为 1 单位
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("尤他茶壶"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T31

    题目:请使用 OpenGL 和 GLUT 编写一个显示线框球体的简单图形程序。其中球体的半径为 0.8,经线数为 24,纬线数为 12,并绕 x 轴旋转 30 度,程序窗口的大小为(200, 200),标题为“线框球”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
        glLoadIdentity(); // 初始化矩阵
        glRotated(30, 1, 0, 0); // 旋转
        glutWireSphere(0.8, 24, 12); // 线框球(半径、经线、纬线)
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("线框球"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T32

    题目:请使用 OpenGL 和 GLUT 编写一个显示线框椭球体的简单图形程序。其中椭球体的两极方向为上下方向,左右方向的半径为 0.98,上下方向的半径为 0.49,前后方向的半径为 0.6,经线数为 48,纬线数为 24,使用正投影,裁剪窗口为(-1, -0.5)~(1, 0.5),程序窗口的大小为(400, 200),标题为“线框椭球”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
        glLoadIdentity(); // 初始化矩阵
        glRotated(-90, 1, 0, 0); // 两级为上下方向
        glScaled(0.98, 0.49, 0.6); // 缩放(左右、上下、前后)
        gluOrtho2D(-1, 1, -0.5, 0.5); // 裁剪窗口
    
        glutWireSphere(1, 48, 24); // 线框球(半径、经线、纬线)
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(400, 200); // 程序窗口大小
        glutCreateWindow("线框椭球"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T33

    题目:请使用 OpenGL、GLU 和 GLUT 编写一个三维犹他茶壶程序。其中茶壶的半径为 1 单位,并远移 6.5 单位;观察体规定为:视场角=30 度,宽高比=1,近=1,远=100;程序窗口的大小为(200, 200),标题为“旋转的尤他茶壶”。茶壶绕 z 轴不断旋转,旋转的时间间隔为 25 毫秒,角度间隔为 2 度。注意旋转角度必须限定在 0~360 度以内。

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    int rot = 0; // 旋转角度
    
    // 思路参考 P89
    void Timer(int millis){
        rot = (rot + 2) % 360;
        glutPostRedisplay(); // 场景描绘函数
        glutTimerFunc(millis, Timer, millis); // (间隔毫秒数、函数名、参数值)
    }
    
    void Paint(){
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    
        glLoadIdentity(); // 初始化矩阵
        glRotatef(rot, 0, 0, 1); // 绕 z 轴旋转rot
        glColor3f(1, 1, 1);
    
        gluPerspective(30, 1, 1, 100); // 视角
        glTranslated(0, 0, -6.5); // 远移 6.5 单位
        glutWireTeapot(1); // 3D茶壶,半径为 1 单位
        glFlush();
    
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("旋转的尤他茶壶"); // 窗口标题
    
        glutTimerFunc(25, Timer, 25);
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    
    T35

    题目:请使用 OpenGL、GLU 和 GLUT 编写一个简单的多视口演示程序。要求:在屏幕窗口左下角的 1/4 部分显示一个红色的填充正三角形;在屏幕窗口右上角的 1/4 部分显示一个绿色的填充正方形;三角形和正方形的左下角顶点坐标值均为(0, 0),右下角顶点坐标值均为(1, 0);裁剪窗口均为(-0.1, -0.1)~(1.1, 1.1);程序窗口的大小为(200, 200),标题为“多视口演示”

    #include <GL/glu.h>
    #include <GL/glut.h>
    
    // 思路参考 P29
    void Triangle(){
        glBegin(GL_TRIANGLES);
        glVertex2d(0, 0);
        glVertex2d(1, 0);
        glVertex2d(0.5, 0.8660);
        glEnd();
    }
    
    void Rectangle(){ // 矩形
        glRectf(0, 0, 1, 1); // 对角的坐标 (0,0) & (1, 1)
    }
    
    void Paint(){
        int w = glutGet(GLUT_WINDOW_WIDTH);
        int h = glutGet(GLUT_WINDOW_HEIGHT);
        glLoadIdentity(); // 初始化矩阵
        gluOrtho2D(-0.1, 1.1, -0.1, 1.1); // 裁剪窗口
    
        glClear(GL_COLOR_BUFFER_BIT); // 初始化颜色缓冲区
    
        glViewport(0, 0, w/2, h/2); // 左下
        glColor3f(1, 0, 0);
        Triangle();
    
        glViewport(w/2, h/2, w/2, h/2); // 右上
        glColor3f(0, 1, 0);
        Rectangle();
    
        glFlush();
    }
    
    int main(int argc, char **argv){
        glutInit(&argc, argv); // 做题不写
        glutInitWindowSize(200, 200); // 程序窗口大小
        glutCreateWindow("多视口演示"); // 窗口标题
        glutDisplayFunc(Paint); // 执行场景绘制函数
        glutMainLoop(); // 开始循环执行 OpenGL 命令
    }
    

    OpenCV

    T35

    请使用 OpenCV 编写一个简单的程序,用于从当前目录读入并显示一幅彩色图像(例如当前目录中的
    lena.jpg)。

    #include "iostream"
    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    using namespace std;
    using namespace cv;
    
    int main() {
        IplImage *im = cvLoadImage("075.jpg", 1); // 声明 IplImage 指针,载入彩色图像。0是灰色
    
        if(im == 0) return -1;
    
        cvShowImage("OpenCV_T35", im); // 显示图像
    
        while (cvWaitKey(0) != 27){} // 等待Esc
    
        cvReleaseImage(&im); // 释放图像
        cvDestroyWindow("OpenCV_T35"); // 销毁窗口
    }
    
    T36

    请使用 OpenCV 编写一个简单的程序,用于从当前目录读入并显示一幅灰度图像(例如当前目录中的
    lena.jpg)。

    int main() {
        CvMat *mat = cvLoadImageM("075.jpg", 0); // 声明灰度图像
        
        if(mat == 0) return -1;
        
        cvShowImage("OpenCV_T36", mat); // 创建窗口显示图像
        
        while (cvWaitKey(0) != 27) {} // 等待Esc
        
        cvReleaseMat(&mat);
        cvDestroyAllWindows(); // 销毁所有窗口
    }
    
    T37

    请使用 OpenCV 编写一个简单的程序,该程序首先读入一幅彩色图像(例如当前目录中的 lena.jpg),然
    后将这幅彩色图像的 3 个通道分离出来,得到 3 幅灰度图像,最后显示这 3 幅灰度图像。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    using namespace std;
    using namespace cv;
    
    int main() {
        IplImage *img = cvLoadImage("075.jpg", 1); // 载入彩色图像,参数为0载入的是灰色
    
        if(img == 0) return -1;
    
        IplImage *redImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
        IplImage *greenImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
        IplImage *blueImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
    
        // OpenCV采用的色彩模式是 BGR
        cvSplit(img, blueImage, greenImage, redImage, 0);
    
        cvShowImage("main", img);
        cvShowImage("blue", blueImage);
        cvShowImage("green", greenImage);
        cvShowImage("red", redImage);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseImage(&img);
        cvReleaseImage(&redImage);
        cvReleaseImage(&greenImage);
        cvReleaseImage(&blueImage);
        cvDestroyAllWindows();
    }
    
    T38

    请使用 OpenCV 编写一个简单的程序,该程序从 1 幅彩色图像(使用当前目录中的 lena.jpg)中分离出蓝
    色通道,得到 1 幅灰度图像。要求显示源图像和结果图像。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    using namespace std;
    using namespace cv;
    
    int main() {
        IplImage *img = cvLoadImage("075.jpg", 1); // 载入彩色图像
    
        if(img == 0) return -1;
    
        IplImage *blueImage = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
    
        // OpenCV采用的色彩模式是BGR
        cvSplit(img, blueImage, 0, 0, 0);
    
        cvShowImage("main", img);
        cvShowImage("blue", blueImage);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseImage(&img);
        cvReleaseImage(&blueImage);
        cvDestroyAllWindows();
    }
    
    T39

    请使用 OpenCV 编写一个简单的程序,该程序首先从一幅真彩色图像(使用当前目录中的 lena.jpg)中选
    取一个矩形子集,并用蓝色填充该矩形子集,然后显示图像。其中矩形子集的起始位置为(64, 96),大小为(96, 48)。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *img = cvLoadImageM("075.jpg", 1); // 载入彩色图像
        if(img == 0) return -1;
        CvRect R = {64, 69, 96, 48}; // 起始位置和大小
        CvMat head; // 结果矩阵头
        CvMat *Y = cvGetSubRect(img, &head, R); // 选取矩形子集
        cvSet(Y, CV_RGB(0, 0, 255), NULL); // 矩形子集改为 蓝色:CV_RGB(0, 0, 255)
    
        cvShowImage("main", img);
        while (cvWaitKey(0) != 27) {}
        cvReleaseMat(&img);
        cvDestroyAllWindows();
    }
    
    T40

    使用 OpenCV 装入一幅大小至少为 512*512 的真彩色图像,并显示该图像(使用当前目录中的 lena.jpg)。
    然后在源图像中指定一个矩形区域(左上顶点和宽高值分别为(128, 256)和(256, 128)的矩形),并在结果图像窗口中显示源图像中被选取的部分。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *img = cvLoadImageM("075.jpg", 1); // 载入彩色图像
        if(img == 0) return -1;
        CvRect R = {128, 256, 256, 128}; // 起始位置和大小
        CvMat head; // 结果矩阵头
        CvMat *Y = cvGetSubRect(img, &head, R); // 选取矩形子集
    
        cvShowImage("main", Y);// 这里是显示 Y 区域
        while (cvWaitKey(0) != 27) {}
        cvReleaseMat(&img);
        cvDestroyAllWindows();
    }
    
    T41 -- 没太理解

    使用 OpenCV 编写一个程序,该程序将一幅灰度图像(使用当前目录中的 lena.jpg)的灰度值线性地变换
    到范围[0, 255]。要求分别显示源图像和结果图像。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *X = cvLoadImageM("075.jpg", 0); // 载入灰度图像
    
        // 定义结果图像,与源图像大小相同的双精度矩阵
        CvMat *Y = cvCreateMat(X->rows, X->cols, CV_64F);
        cvScale(X, Y, 1, 0);   // Y(i) = 1 * X + 0 
        cvNormalize(Y, Y, 0, 255, CV_MINMAX, 0);
    
        cvShowImage("Main", X);
        cvShowImage("Scale", Y);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseMat(&X);
        cvReleaseMat(&Y);
        cvDestroyAllWindows();
    }
    
    T42

    随机生成一幅浮点数灰度图像(大小和亮度都是随机的,大小值位于区间[128, 639]),然后将该图像变
    换成亮度是 0~1 的浮点数图像,最后变换成字节图像并显示该图像。

    一脸懵逼:opencv随机生成点图像

    T46

    使用 OpenCV 编写一个演示傅立叶变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像(例
    如当前目录中的 lena.jpg),然后对该图像进行傅立叶正变换,对得到的结果进行傅立叶逆变换,显示得到的结果以便与原图像进行比对。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *X = cvLoadImageM("075.jpg", 0); // 载入灰度图像
    
        // 定义结果图像,与源图像大小相同的双精度矩阵
        CvMat *Y = cvCreateMat(X->rows, X->cols, CV_64F);
        cvScale(X, Y, (double)1 / 255, 0);
    
        cvDFT(Y, Y, CV_DXT_FORWARD, 0);
        cvDFT(Y, Y, CV_DXT_INVERSE_SCALE, 0);
    
        cvShowImage("Main", X);
        cvShowImage("Dst", Y);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseMat(&X);
        cvReleaseMat(&Y);
        cvDestroyAllWindows();
    }
    
    T49(复现课本,编译出错)

    题目:使用 OpenCV 编写一个演示离散余弦变换和逆变换的程序。该程序首先装入一幅灰度图像并显示该图像(例如当前目录中的 lena.jpg),然后对该图像进行离散余弦正变换,对得到的结果进行离散余弦逆变换,显示得到的结果以便与原图像进行比对。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *src = cvLoadImageM("075.jpg", 0); // 载入灰度图像
    
        CvMat *X = cvCreateMat(src->rows, src->cols, CV_64F);
        cvScale(src, X, (double)1/255, 0);
    
        cvDCT(X, X, CV_DXT_FORWARD);
    
        // 靠近原点的元素改为0
        for (int u = 0; u < src->cols; ++u)
            for (int v = 0; v < src->rows; ++v)
                cvmSet(src, v, u, 0);
        cvDCT(X, X, CV_DXT_INVERSE);
    
        cvShowImage("Source", src);
        cvShowImage("DCT", X);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseMat(&src);
        cvReleaseMat(&X);
        cvDestroyAllWindows();
    }
    
    T52、53、54

    题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(使用当前目录中的 lena-n.jpg)进行一次简单模糊、高斯模糊、中值模糊,要求分别显示源图像和结果图像。其中内核大小分别为 3×3、5x5、3x3。

    注意,main函数第一行,和注释部分内核大小,请根据题意做出更改。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *src = cvLoadImageM("075.jpg", 1); // 载入彩色图像,0表示灰色图像
        cvShowImage("Source", src);
    
        // 结果图像
        CvMat *X = cvCreateMat(src->rows, src->cols, src->type);
    
        cvSmooth(src, X, CV_BLUR, 3, 3, 0, 0); // 简单,3*3模板
        cvShowImage("CV_BLUR", X);
    
    //    cvSmooth(src, X, CV_GAUSSIAN, 5, 5, 0, 0);// 高斯,5*5模板
    //    cvShowImage("CV_GAUSSIAN", X);
    //
    //    cvSmooth(src, X, CV_MEDIAN, 3, 3, 0, 0); // 中值,3*3模板
    //    cvShowImage("CV_MEDIAN", X);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseMat(&src);
        cvReleaseMat(&X);
        cvDestroyAllWindows();
    }
    
    效果图:效果图: 1562420178278.png
    T55

    题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行 Sobel 锐化,要求显示(T56:显示原图像和)锐化以后的图像。其中内核大小为 3×3,x 和 y 方向均使用 1 阶差分(T56:使用 1 阶 x 差分,T57:使用Laplace,3*3内核)。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *src = cvLoadImageM("075.jpg", 0); // 载入图像
        if(src == 0)
            return -1;
        
        // cvShowImage("source", src); // T56
        CvMat *tmp = cvCreateMat(src->rows, src->cols, CV_32F);
        cvSobel(src, tmp, 1, 1, 3); // 使用Sober,x,y方向1阶差分,3*3内核
        // cvSobel(src, tmp, 1, 0, 3); // T56 使用Sober,x方向1阶差分,3*3内核
        // cvLaplace(src, tmp, 3); // T57,使用Laplace,3*3内核
        
        // 下三行也可直接 cvShowImage("Sober", tmp);
        CvMat *Y = cvCreateMat(src->rows, src->cols, CV_8U); // 字节图像
        cvConvert(tmp, Y); // 输出图像转化为字节图像
        cvShowImage("Sober", Y);
    
        while (cvWaitKey(0) != 27) {}
    
        cvReleaseMat(&Y);
        cvDestroyAllWindows();
    }
    
    T61

    题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行直方图均衡化,要求分别显示源图像和均衡化以后的图像。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *src = cvLoadImageM("075.jpg", 0); // 载入图像
        if(src == 0)
            return -1;
        cvShowImage("source", src);
        cvEqualizeHist(src, src); // 应用直方图均衡化
        cvShowImage("EqualizeHist Image", src);
    
        while (cvWaitKey(0) != 27) {}
        cvReleaseMat(&src);
        cvDestroyAllWindows();
    }
    
    T62

    题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行二值化变换,要求分别显示源图像和二值化以后的图像。其中二值化阈值为 127,高亮度改为 255。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *X= cvLoadImageM("075.jpg", 0); // 载入图像
        if(X == 0)
            return -1;
        cvShowImage("Source", X);
        cvThreshold(X, X, 127, 255, CV_THRESH_BINARY); // 二值化
        cvShowImage("阈值(127),高度(255)", X);
    
        while (cvWaitKey(0) != 27) {}
        cvReleaseMat(&X);
        cvDestroyAllWindows();
    }
    
    T63

    题目:使用 OpenCV 编写一个程序,该程序对一幅灰度图像(例如当前目录中的 lena.jpg)进行 Canny 边缘检测,要求分别显示源图像和检测到的边缘。其中小阈值为 50,大阈值为 150,内核大小为 3。

    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    int main() {
        CvMat *X= cvLoadImageM("075.jpg", 0); // 载入图像
        if(X == 0)
            return -1;
        cvShowImage("Source", X);
    
        cvCanny(X, X, 50, 3 * 50, 3);
        cvShowImage("Canny: 50, 3 * 50", X);
    
        while (cvWaitKey(0) != 27) {}
        cvReleaseMat(&X);
        cvDestroyAllWindows();
    }
    

    相关文章

      网友评论

          本文标题:计算机图形图像技术-复习参考题代码部分答案

          本文链接:https://www.haomeiwen.com/subject/jnqbhctx.html