实验报告---实验三图像灰度变换处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与工程学院
天津理工大学
计算机科学与工程学院
实验报告
2016 至2017 学年第二学期
实验三图像灰度变换处理
课程名称数字图像处理
学号学生姓名卢洪利年级2014
专业计算机科学
与技术
教学班号2实验地点主7-215
实验时间2016年4月4日第1节至第2 节
主讲教师杨淑莹
实验成绩
软件运行特色算法分析流程设计报告成绩总成绩
实验(三)实验名称图像灰度变换处理
软件环境OpenSUSE Leap 42.2
Qt 5.6.1
硬件环境PC
实验目的
掌握图像的灰度变换原理,编程实现图像的灰度变换功能。
实验内容(应包括实验题目、实验要求、实验任务等)
1.实现灰度直方图。
要求:了解灰度直方图基本原理,实现灰度直方图。
说明:灰度直方图基本原理
1 灰度直方图简介
2 基本原理
任务:
(1)在左视图中打开一幅位图。
(2)制作一个【灰度直方图】菜单,将消息映射到右视图中,在右视图中实现灰度直方图。
2.实现灰度线性变换。
要求:了解灰度线性变换基本原理,实现灰度线性变换。
说明:灰度线性变换基本原理
任务:
(1)在左视图中打开一幅位图。
(2)制作一个【灰度线性变换】菜单,将消息映射到右视图中,在右视图中实现灰度线性变换。
3.实现灰度非线性变换。
要求:了解灰度非线性变换基本原理,实现灰度非线性变换。
说明:灰度非线性变换基本原理
1灰度对数变换
2灰度幂次变换
3灰度指数变换
任务:
(1)在左视图中打开一幅位图。
(2)制作一个【灰度对数变换】菜单,将消息映射到右视图中,在右视图中实现灰度对数变换。
(3)制作一个【灰度幂次变换】菜单,将消息映射到右视图中,在右视图中实现灰度对数变换。
(4)制作一个【灰度指数变换】菜单,将消息映射到右视图中,在右视图
中实现灰度指数变换。
4.实现阈值变换。
要求:了解阈值变换图基本原理,实现灰度阈值变换
说明:灰度阈值变换基本原理
任务:
(1)在左视图中打开一幅位图。
(2)制作一个【阈值变换】菜单,将消息映射到右视图中,在右视图
中实现阈值变换。
5.实现拉伸变换。
要求:了解拉伸变换图基本原理,实现图像拉伸变换
说明:拉伸变换基本原理
任务:
(1)在左视图中打开一幅位图。
(2)制作一个【拉伸变换】菜单,将消息映射到右视图中,在右视图
中实现拉伸变换。
6.实现均衡变换。
要求:了解均衡变换图基本原理,实现均衡变换。
说明:
任务:
(1)在左视图中打开一幅位图。
(2)制作一个【均衡变换】菜单,将消息映射到右视图中,在右视图
中实现均衡变换。
实验过程与实验结果
一、直方图
图像直方图是用来表示图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。
对于直方图所表达的含义,简单来说就一条规则:“左暗右明”,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图的波峰应该出现在左侧和中间(如上图是一张较暗图像的直方图);而整体明亮、只有少量阴影的图像则相反。
我们的实验中,除了灰度直方图外,还分别对红、绿、蓝三个分量绘制了直方图。
对于真彩色图像来说,绘制灰度直方图的第一步是得到每个像素的灰度值,从RGB转换为灰度值有一个著名的心理学公式:
之所以不用平均值,是因为是因为人眼对RGB颜色的感知程度并不相同,所以在转换的时候应该分别为RGB设置不同的权重。
考虑到一幅图像的每个像素都需要使用上面的公式,计算量比较大,我们这里采用了:
程序截图:
图一直方图
实验代码:
因为直方图的绘制过程稍复杂,这里我们将这个功能单独设置为一个类,完成该过程的计算、存储和在屏幕上的绘制操作。
#ifndef HISTOGRAM_H
#define HISTOGRAM_H
#include
#include
#include
#include
class Histogram : public QLabel
{
public:
Histogram(QWidget* parent = 0);
Histogram(QWidget*, Histogram*);
void computeHstgrm(QImage img);
void paintEvent(QPaintEvent *e);
void drawBwHstgrm(int xBase, int yBase, int height);
void drawRedHstgrm(int xBase, int yBase, int height);
void drawGreenHstgrm(int xBase, int yBase, int height);
void drawBlueHstgrm(int xBase, int yBase, int height);
int getBwHstgrm(int index);
int getRedHstgrm(int index);
int getGreenHstgrm(int index);
int getBlueHstgrm(int index);
private:
// index 0 to 255 => count of image's pixels for this value // index 256 => maximum value
// index 257 => total value of the dark component
// index 258 => total value of the light component
int bwHstgrm[259];
// index 0 to 255 => count of image's pixels for this value // index 256 => maximum value
// index 257 => total value of the component
int redHstgrm[258];
int greenHstgrm[258];
int blueHstgrm[258];
};
#endif // HISTOGRAM_H
对该类的实现如下:
#include "histogram.h"
#include
#include
Histogram::Histogram(QWidget * parent) : QLabel(parent) {
for(int i = 0;i<256;i++)
{
bwHstgrm[i] = 0;
redHstgrm[i] = 0;
greenHstgrm[i] = 0;
blueHstgrm[i] = 0;