实验报告实验三图像灰度变换处理.docx
- 文档编号:24245177
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:38
- 大小:416.80KB
实验报告实验三图像灰度变换处理.docx
《实验报告实验三图像灰度变换处理.docx》由会员分享,可在线阅读,更多相关《实验报告实验三图像灰度变换处理.docx(38页珍藏版)》请在冰豆网上搜索。
实验报告实验三图像灰度变换处理
天津理工大学
计算机科学与工程学院
实验报告
2016至2017学年第二学期
实验三图像灰度变换处理
课程名称
数字图像处理
学号
学生姓名
卢洪利
年级
2014
专业
计算机科学与技术
教学班号
2
实验地点
主7-215
实验时间
2016年4月4日第1节至第2节
主讲教师
杨淑莹
实验成绩
软件运行
特色
算法分析
流程设计
报告成绩
总成绩
实验(三)
实验名称
图像灰度变换处理
软件环境
OpenSUSELeap42.2
Qt5.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设置不同的权重。
考虑到一幅图像的每个像素都需要使用上面的公式,计算量比较大,我们这里采用了:
程序截图:
图一直方图
实验代码:
因为直方图的绘制过程稍复杂,这里我们将这个功能单独设置为一个类,完成该过程的计算、存储和在屏幕上的绘制操作。
类的结构包括对灰度及各颜色分量数据的存储、绘制函数:
#ifndefHISTOGRAM_H
#defineHISTOGRAM_H
#include
#include
#include
#include
classHistogram:
publicQLabel
{
public:
Histogram(QWidget*parent=0);
Histogram(QWidget*,Histogram*);
voidcomputeHstgrm(QImageimg);
voidpaintEvent(QPaintEvent*e);
voiddrawBwHstgrm(intxBase,intyBase,intheight);
voiddrawRedHstgrm(intxBase,intyBase,intheight);
voiddrawGreenHstgrm(intxBase,intyBase,intheight);
voiddrawBlueHstgrm(intxBase,intyBase,intheight);
intgetBwHstgrm(intindex);
intgetRedHstgrm(intindex);
intgetGreenHstgrm(intindex);
intgetBlueHstgrm(intindex);
private:
//index0to255=>countofimage'spixelsforthisvalue
//index256=>maximumvalue
//index257=>totalvalueofthedarkcomponent
//index258=>totalvalueofthelightcomponent
intbwHstgrm[259];
//index0to255=>countofimage'spixelsforthisvalue
//index256=>maximumvalue
//index257=>totalvalueofthecomponent
intredHstgrm[258];
intgreenHstgrm[258];
intblueHstgrm[258];
};
#endif//HISTOGRAM_H
对该类的实现如下:
#include"histogram.h"
#include
#include
Histogram:
:
Histogram(QWidget*parent):
QLabel(parent)
{
for(inti=0;i<256;i++)
{
bwHstgrm[i]=0;
redHstgrm[i]=0;
greenHstgrm[i]=0;
blueHstgrm[i]=0;
}
bwHstgrm[256]=-1;
redHstgrm[256]=-1;
greenHstgrm[256]=-1;
blueHstgrm[256]=-1;
redHstgrm[257]=0;
greenHstgrm[257]=0;
blueHstgrm[257]=0;
bwHstgrm[257]=0;
bwHstgrm[258]=0;
}
Histogram:
:
Histogram(QWidget*parent,Histogram*hstgrm):
QLabel(parent)
{
for(inti=0;i<258;i++)
{
bwHstgrm[i]=hstgrm->bwHstgrm[i];
redHstgrm[i]=hstgrm->redHstgrm[i];
greenHstgrm[i]=hstgrm->greenHstgrm[i];
blueHstgrm[i]=hstgrm->blueHstgrm[i];
}
bwHstgrm[258]=hstgrm->bwHstgrm[258];
}
voidHistogram:
:
computeHstgrm(QImageimg)
{
if(!
img.isNull())
{
for(inti=0;i { for(intj=0;j { intbwValue=qGray(img.pixel(j,i)); intredValue=qRed(img.pixel(j,i)); intgreenValue=qGreen(img.pixel(j,i)); intblueValue=qBlue(img.pixel(j,i)); bwHstgrm[bwValue]++; redHstgrm[redValue]++; greenHstgrm[greenValue]++; blueHstgrm[blueValue]++; } } for(inti=0;i<256;i++) { //maximumvalues if(bwHstgrm[256] bwHstgrm[256]=bwHstgrm[i]; if(redHstgrm[256] redHstgrm[256]=redHstgrm[i]; if(greenHstgrm[256] greenHstgrm[256]=greenHstgrm[i]; if(blueHstgrm[256] blueHstgrm[256]=blueHstgrm[i]; //valuesofcolourcomponents redHstgrm[257]+=i*redHstgrm[i]; greenHstgrm[257]+=i*greenHstgrm[i]; blueHstgrm[257]+=i*blueHstgrm[i]; //valuesofdarkandlightcomponent if(i<=127) bwHstgrm[257]+=(127-i)*bwHstgrm[i]; else bwHstgrm[258]+=(i-127)*bwHstgrm[i]; } } } voidHistogram: : paintEvent(QPaintEvent*event) { Q_UNUSED(event); intstep=100;//distancebetweenhistograms intheight=255+10;//histogramsheight intxBase=99;//xcoordinateofthefirsthistogramorigin intyBase=30+height+1;//ycoordinateofthefirsthistogramorigin QPainterpainter(this); painter.setPen(Qt: : black); //显示在第一行 //bwhstgrm if(bwHstgrm[256]! =-1) drawBwHstgrm(xBase,yBase,height); else painter.drawText(xBase,yBase-height/2+5,tr("Can'tloadthegraylevelshistogram.")); //redhstgrm if(redHstgrm[256]! =-1) drawRedHstgrm(xBase+step+height,yBase,height); else painter.drawText(xBase+step+height+1-height/2+5,yBase,tr("Can'tloadtheredcomponenthistogram.")); //显示在第二行 //greenhstgrm if(greenHstgrm[256]! =-1) drawGreenHstgrm(xBase,yBase+step+height+1,height); else painter.drawText(xBase,yBase+(step+height+1),tr("Can'tloadthegreencomponenthistogram.")); //bluehstgrm if(blueHstgrm[256]! =-1) drawBlueHstgrm(xBase+step+height,yBase+step+height+1,height); else painter.drawText(xBase+step+height,yBase+step+height+1,tr("Can'tloadthebluecomponenthistogram.")); } voidHistogram: : drawBwHstgrm(intxBase,intyBase,intheight) { QPainterpainter(this); painter.setPen(Qt: : darkGray); floatmax=bwHstgrm[256]; if(max max=redHstgrm[256]; if(max max=greenHstgrm[256]; if(max max=blueHstgrm[256]; //drawingthehistogram for(inti=0;i<256;i++) { painter.drawLine(xBase+1+i,yBase,xBase+1+i, yBase-(float)(256./max)*(float)bwHstgrm[i]); } painter.drawText(xBase,yBase+25,tr("black")); painter.drawText(xBase+220,yBase+25,tr("white")); painter.setPen(Qt: : black); painter.drawText(xBase+40,yBase-height-10,tr("GRAYLEVELSHISTOGRAM")); painter.drawText(xBase+100,yBase+15,tr("Intensity")); painter.drawText(xBase-84,yBase-height/2+5,tr("Pixelscount")); //abscissa painter.drawLine(xBase,yBase,xBase+256+1,yBase); painter.drawLine(xBase,yBase+1,xBase+256+1,yBase+1); //leftordinate painter.drawLine(xBase,yBase,xBase,yBase-height); painter.drawLine(xBase-1,yBase,xBase-1,yBase-height); //rightordinate painter.drawLine(xBase+256+1,yBase,xBase+256+1,yBase-height); painter.drawLine(xBase+256+2,yBase,xBase+256+2,yBase-height); //leftordinatearrow painter.drawLine(xBase,yBase-height,xBase+4,yBase-height+7); painter.drawLine(xBase-1,yBase-height,xBase-1-4,yBase-height+7); //rightordinatearrow painter.drawLine(xBase+256+1,yBase-height,xBase+256+1-4,yBase-height+7); painter.drawLine(xBase+256+2,yBase-height,xBase+256+2+4,yBase-height+7); } voidHistogram: : drawRedHstgrm(intxBase,intyBase,intheight) { QPainterpainter(this); painter.setPen(Qt: : darkRed); floatmax=bwHstgrm[256]; if(max max=redHstgrm[256]; if(max max=greenHstgrm[256]; if(max max=blueHstgrm[256]; //drawingthehistogram for(inti=0;i<256;i++) { painter.drawLine(xBase+1+i,yBase,xBase+1+i, yBase-(float)(256./max)*(float)redHstgrm[i]); } painter.drawText(xBase,yBase+25,tr("dark")); painter.drawText(xBase+225,yBase+25,tr("light")); painter.setPen(Qt: : black); painter.drawText(xBase+25,yBase-height-10,tr("REDCOMPONENTHISTOGRAM")); painter.drawText(xBase+100,yBase+15,tr("Intensity")); painter.drawText(xBase-84,yBase-height/2+5,tr("Pixelscount")); //abscissa painter.drawLine(xBase,yBase,xBase+256+1,yBase); painter.drawLine(xBase,yBase+1,xBase+256+1,yBase+1); //leftordinate painter.drawLine(xBase,yBase,xBase,yBase-height); painter.drawLine(xBase-1,yBase,xBase-1,yBase-height); //rightordinate painter.drawLine(xBase+256+1,yBase,xBase+256+1,yBase-height); painter.drawLine(xBase+256+2,yBase,xBase+256+2,yBase-height); //leftordinatearrow painter.drawLine(xBase,yBase-height,xBase+4,yBase-height+7); painter.drawLine(xBase-1,yBase-height,xBase-1-4,yBase-height+7); //rightordinatearrow painter.drawLine(xBase+256+1,yBase-height,xBase+256+1-4,yBase-height+7); painter.drawLine(xBase+256+2,yBase-height,xBase+256+2+4,yBase-height+7); } voidHistogram: : drawGreenHstgrm(intxBase,intyBase,intheight) { QPainterpainter(this); painter.setPen(Qt: : darkGreen); floatmax=bwHstgrm[256]; if(max max=redHstgrm[256]; if(max max=greenHstgrm[256]; if(max max=blueHstgrm[256]; //drawingthehistogram for(inti=0;i<256;i++) { painter.drawLine(xBase+1+i,yBase,xBase+1+i, yBase-(float)(256./max)*(float)greenHstgrm[i]); } painter.drawText(xBase,yBase+25,tr("dark")); painter.drawText(xBase+225,yBase+25,tr("light")); painter.setPen(Qt: : black); painter.drawText(xBase+15,yBase-height-10,tr("GREENCOMPONENTHISTOGRAM")); painter.drawText(xBase+100,yBase+15,tr("Intensity")); painter.drawText(xBase-84,yBase-height/2+5,tr("Pixelscount")); //abscissa painter.drawLine(xBase,yBase,xBase+256+1,yBase);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 图像 灰度 变换 处理
![提示](https://static.bdocx.com/images/bang_tan.gif)