版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
图像的变化15.1.1-1.颜色反相真彩色颜色反相非真彩色颜色反相25.1.1-1.颜色反相颜色反相是指正相变负相,或负相变正相g=Max-f对于二值图像Max取值1对于256色的图像Max取值255。真彩色图像的3个颜色分量都需进行这样的运算非真彩色图像只需修改调色板单元的数值演示程序:色调变化/颜色反相第五章图象变化.cpp-OnInvertColor()3真彩色图像的颜色反相BGR
bgrb=255-Bg=255-Gr=255-R4真彩色图像的颜色反相-反相每个图象相素每个真彩色图像像素数据的三个颜色分量都作相同的计算voidInvertPixels(CImage*pImage,int
nMold){ BYTE *pPixelLine;
int
nLine,nByte,nBytesPerLine,nHeight;
nHeight=pImage->GetHeight();
nBytesPerLine=nWidth*pImage->GetBPP()/8; for(nLine=0;nLine<nHeight;nLine++){
pPixelLine=(BYTE*)pImage->GetPixelAddress(0,nLine);//得行首址
//真彩色图像像素数据的三个颜色分量作相同的计算
for(nByte=0;nByte<nBytesPerLine;nByte++)
pPixelLine[nByte]=nMold-pPixelLine[nByte]; }}5非真彩色图像的颜色反相
RGBrgbb=255-Bg=255-Gr=255-R调色板调色板6非真彩色图像颜色反相-反相调色板非真彩色图像颜色反相只需修改调色板单元的数值
voidInvertPalette(CImage*pImage){
int
i,nColorTableEntries;
RGBQUAD
ColorTabs[256];//调色板
nColorTableEntries=pImage->GetMaxColorTableEntries();//取调色板项数
pImage->GetColorTable(0,nColorTableEntries,ColorTabs);//取调色板
//非真彩色图像颜色反相只需修改调色板单元的数值
for(i=0;i<nColorTableEntries;i++) {
ColorTabs[i].rgbBlue=255-ColorTabs[i].rgbBlue;
ColorTabs[i].rgbGreen=255-ColorTabs[i].rgbGreen;
ColorTabs[i].rgbRed=255-ColorTabs[i].rgbRed; }
pImage->SetColorTable(0,nColorTableEntries,ColorTabs);//设置调色板}75.1.1-2.彩色图像变黑白真彩色变黑白非真彩色变黑白8彩色图像变黑白彩色图像变黑白可通过(5.1.2)式进行计算g=0.30r+0.59g+0.11b (5.1.2)真彩色图像变黑白非真彩色图像变黑白9真彩色图像变黑白g=0.30r+0.59g+0.11b
真彩色图像变换时RGB3分量都取g值。变换后的图像并不是灰阶图像,其数据结构还是原来的结构,只是它们都取相同值因此外观为灰色而已rgb
gggg=0.30r+0.59g+0.11b
g=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11b
10真彩图像变黑白voidPixelsChangedToGray(CImage*pImage){
int
nByte,j,i,nWidth,nHeight,nBytesPerPixel; BYTE *pPixelLine,cNewPixelValue;
nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();
nBytesPerPixel=pImage->GetBPP()/8; for(i=0;i<nHeight;i++){
pPixelLine=(BYTE*)pImage->GetPixelAddress(0,i);
nByte=0; for(j=0;j<nWidth;j++){ cNewPixelValue=(BYTE)(0.11*pPixelLine[nByte]+0.59*pPixelLine[nByte+1]+0.30*pPixelLine[nByte+2]);
pPixelLine[nByte]=pPixelLine[nByte+1]pPixelLine[nByte+2]=cNewPixelValue;
nByte+=nBytesPerPixel; } }}11非真彩色图像变黑白g=0.30r+0.59g+0.11b
非真彩色图像的色调由调色板决定,故变换只需在调色板数据中进行调色板每项数据变灰像素数据保持不变由于只修改调色板中的颜色数据,其强度未必为按序排列,故也不是灰阶图像12非真彩色图像变黑白
rgbgggg=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11b
调色板调色板13非真彩图像变黑白voidPaletteChangedToGray(CImage*pImage){
RGBQUAD
ColorTabs[256];
int
i,nColorTableEntries,nNewGrayColor;
nColorTableEntries=pImage->GetMaxColorTableEntries();
pImage->GetColorTable(0,nColorTableEntries,ColorTabs); for(i=0;i<nColorTableEntries;i++){
nNewGrayColor=(int)(0.11*ColorTabs[i].rgbBlue+0.59*ColorTabs[i].rgbGreen
+0.30*ColorTabs[i].rgbRed);
ColorTabs[i].rgbBlue=(BYTE)nNewGrayColor;
ColorTabs[i].rgbGreen=(BYTE)nNewGrayColor;
ColorTabs[i].rgbRed=(BYTE)nNewGrayColor;
}
pImage->SetColorTable(0,nColorTableEntries,ColorTabs);}145.2.2几何变换-水平镜像水平镜像同一行内左右对应的像素两两互换演示程序:图象变化/几何变换:水平镜像Program第五章图象变化.cpp-OnHorizontalFlip()15水平镜像
0123012345612301230456123123Pixel(i,j)Pixel(nWidth-1-i,j)(1,2)(2,2)16水平镜像voidHorizontalFlip(CImage*pNewImage,CImage*pImage){int
i,j,nByte,nWidth,nHeight,nBytesPerPixel,nBytesPerLine,nBitsPerPixel;DWORD
dwPixelValue;BYTE *pOldPixelLine,*pNewPixelLine,*pNew,*pOriginal;
nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();
nBitsPerPixel=pImage->GetBPP(); nBytesPerPixel=nBitsPerPixel/8;
CopyImage(pNewImage,pImage); for(i=0;i<nHeight;i++){
pOldPixelLine=(BYTE*)pImage->GetPixelAddress(0,i);
pNewPixelLine=(BYTE*)pNewImage->GetPixelAddress(0,i);
nByte=0; for(j=0;j<nWidth;j++){
pOriginal=pOldPixelLine+nByte;
pNew=pNewPixelLine+(nWidth-1)*nBytesPerPixel-nByte; memcpy(pNew,pOriginal,nBytesPerPixel);
nByte+=nBytesPerPixel; } }}175.2.2几何变换-垂直镜像垂直镜像(留作作业)同一列内上下对应的像素两两互换
0123012301230123Pixel(i,j)Pixel(i,Height-1-j)(1,2)(1,1)185.2.4几何变换-整数倍放大(扩展法)图像的整数倍放大是指图像的1个像素放大成1个n×n的矩形块,粒子变粗但像素数量不变。演示程序:图象变化/几何变换:放大1倍Program第五章图象变化.cpp-OnZoomIn()012012012345012345Pixel(i,j)Pixel(2*i,2*j)Pixel(2*i,2*j+1)Pixel(2*i+1,2*j)Pixel(2*i+1,2*j+1)19整数倍放大voidZoomInImage(CImage*pNewImage,CImage*pImage,int
nTimesFactor){
inti,j,nRepeat,nWidth,nHeight,nNewWidth,nNewHeight,nBytesPerPixel,nBitsPerPixel;BYTE *pNewPixel,*pOriginalPixel;
nWidth=pImage->GetWidth(); nHeight=pImage->GetHeight();
nNewWidth=pImage->GetWidth()*nTimesFactor;
nNewHeight=pImage->GetHeight()*nTimesFactor;
nBitsPerPixel=pImage->GetBPP(); nBytesPerPixel=nBitsPerPixel/8;
pNewImage->Create(nNewWidth,nNewHeight,nBitsPerPixel,0););//建立放大的图像
CopyColorTables(pNewImage,pImage);//复制调色板
for(i=0;i<nNewHeight;i++){
pOriginalPixel=(BYTE*)pImage->GetPixelAddress(0,i/nTimesFactor);//得原图行首址
pNewPixel=(BYTE*)pNewImage->GetPixelAddress(0,i);//得新图行首址
for(j=0;j<nWidth;j++){
for(nRepeat=0;nRepeat<nTimesFactor;nRepeat++) {
memcpy(pNewPixel,pOriginalPixel,nBytesPerPixel);//复制像素数据
pNewPixel+=nBytesPerPixel; }
pOriginalPixel+=nBytesPerPixel; }}}20几何变换-整数倍缩小(跳点法)整数倍缩小用跳点方式实现(留作作业)012012012345012345Pixel(i,j)Pixel(i/2,j/2)(2,1)(4,2)215.3图像的非整数倍缩放由于图像的离散性,非整数倍缩放后计算出的坐标值不一定是整数,故需要重新决定整数坐标值。常用的方法是:最近邻点法坐标的计算结果作四舍五入处理,得到它最接近的点的坐标。双线性内插法在xy两个方向上作线性内插,靠得近的像素的权值取得大,离得远的像素的权值取得小。(1,1)(1.67,1.67)335522逆向算法
设原图像为f(x,y),几何变换后的新图像为g(u,v),则由像素的x、y坐标计算变换后对应的u、v坐标的计算称为正向计算。u=Fu(x,y) (5.6.1)v=Fv(x,y) (5.6.2)为了避免新图像中像素的遗漏,通常采用逆向算法。坐标转换计算中,u、v应遍历新图像中的每一个像素。x=Fx(u,v) (5.6.3)y=Fy(u,v) (5.6.4)(1,1)(1.67,1.67)3355正向计算逆向算法23最近邻点法
坐标的计算结果作四舍五入处理,得到它最接近的点的坐标。为了防止颜色失真,真彩色图像的几何变换只能采用最近邻点法演示程序:几何变换/非整数倍缩放(1.3倍)Program第五章图象编程.cpp-ScaleByCloser()(x,y)(x,y)(x+1,y)(x+1,y+1)(x,y+1)24voidScaleByCloser(CImage*pDestImage,CImage*pSourceImage,double
dMultiple){
nWidth=pSourceImage->GetWidth(); nHeight=pSourceImage->GetHeight();
nNewWidth=(int)(nWidth*dMultiple); nNewHeight=(int)(nHeight*dMultiple);
nBytesPerPixel=pSourceImage->GetBPP()/8;
pDestImage->Create(nNewWidth,nNewHeight,pSourceImage->GetBPP(),0);
CopyColorTables(pDestImage,pSourceImage); for(nYInNew=0;nYInNew<nNewHeight;nYInNew++) {
dYInOld=(double)nYInNew/dMultiple;
nOldY=(int)dYInOld;
dYFraction=dYInOld-(double)nOldY; if(dYFraction>0.5&&nOldY<nHeight-1)
nOldY++; for(nXInNew=0;nXInNew<nNewWidth;nXInNew++){
dXInOld=(double)nXInNew/dMultiple; nOldX=(int)dXInOld;
dXFraction=dXInOld-(double)nOldX; if(dXFraction>0.5&&nOldX<nWidth-1)
nOldX++;
pNewPixel=(BYTE*)pDestImage->GetPixelAddress(nXInNew,nYInNew);
pPixel=(BYTE*)pSourceImage->GetPixelAddress(nOldX,nOldY); memcpy(pNewPixel,pPixel,nBytesPerPixel); } }}25双线性内插法
(x,y)点处灰度值的计算公式如下:
p=
x–X (5.7.1)q=y-Y (5.7.2)
f(x,y)=(1-q)[(1-p)f(X,Y)+p
f(X+1,Y)]+q[(1-p)f(X,Y+1)+p
f(X+1,Y+1)] (5.7.3)灰阶图像采用双线性内插法实现生成的图像灰度变化平缓柔和,没有不连续的缺点。演示程序:几何变换/非整数倍缩放(1.3倍)Program第五章图象编程.cpp-ScaleByTwoLinear()(x,y)(X,Y)(X+1,Y)(X+1,Y+1)(X,Y+1)1-ppq1-q26voidScaleByTwoLinear(CImage*pDestImage,CImage*pSourceImage,double
dMultiple){
dwUpLeft=dwUpRight=dwDownLeft=dwDownRight=dwPixelValue=0;
nWidth=pSourceImage->GetWidth(); nHeight=pSourceImage->GetHeight();
nNewWidth=(int)(nWidth*dMultiple); nNewHeight=(int)(nHeight*dMultiple);
nBytesPerPixel=pSourceImage->GetBPP()/8;
pDestImage->Create(nNewWidth,nNewHeight,pSourceImage->GetBPP());
CopyColorTables(pDestImage,pSourceImage);for(nYInNew=0;nYInNew<nNewHeight;nYInNew++){
nY=(int)(nYInNew/dMultiple);
if(nY+1>=nHeight)
nY=nHeight-2; for(nXInNew=0;nXInNew<nNewWidth;nXInNew++){
nX=(int)(nXInNew/dMultiple);
if(nX+1>=nWidth)
nX=nWidth-2;
dX=(double)nXInNew/dMultiple; dY=(double)nYInNew/dMultiple;
dXFraction=dX-nX; dYFraction=dY-nY;27
pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX,nY);
memcpy(&dwUpLeft,pPixel,nBytesPerPixel);
pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX+1,nY);
memcpy(&dwUpRight,pPixel,nBytesPerPixel);
pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX,nY+1);
memcpy(&dwDownLeft,pPixel,nBytesPerPixel);
pPixel=(BYTE*)pSourceImage->GetPixelAddress(nX+1,nY+1);
memcpy(&dwDownRight,pPixel,nBytesPerPixel);
dXWeigh=(1-dXFraction)*dwUpLeft+dXFraction*dwUpRight;
dYWeigh=(1-dXFraction)*dwDownLeft+dXFraction*dwDownRight;
dwPixelValue=(COLORREF)((1-dYFraction)*dXWeigh+dYFraction*dYWeigh);
pNewPixel=(BYTE*)pDestImage->GetPixelAddress(nXInNew,nYInNew);
memcpy(pNewPixel,&dwPixelValue,nBytesPerPixel);}}}285.2.5几何变换-旋转顺时针旋转90度通过行列数据的交换来实现演示程序:图象变化/几何变换:顺时针旋转90度Program第五章图象变化.cpp-OnRotate90Clockwise()0120123401234012(2,1)(3,2)Pixel(x,y)Pixel(OldHeigh-1-y,x)OldHeighxyyX?29顺时针旋转90度voidRotate90Clockwise(CImage*pNewImage,CImage*pImage){
int
nBytesPerPixel,nWidth,nHeight,nX,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中专老师新学期工作计划
- 学生工作计划合集六篇
- 专科毕业实习报告15篇
- 江苏省南京师范大学附属中学树人学校2024-2025学年上学期12月月考九年级数学测试卷(含部分答案)
- 高二语文上学期期末考点大串讲(统编版选择性必修上册+中册)专题03 文言文阅读(知识清单)
- 典型固体废物资源化技术
- 《IABP使用常见问题》课件
- 2024届河南省息县高三下学期三校联考高考一模地理试卷
- 供热企业安全培训
- 《自动控制原理及其应用》全套教学课件
- 第2课 古代希腊罗马(新教材课件)-【中职专用】《世界历史》(高教版2023•基础模块)
- 2024年省绵阳市招才引智活动面向全国引进高层次和急需紧缺人才6385人高频考题难、易错点模拟试题(共500题)附带答案详解
- 微观经济学(对外经济贸易大学)智慧树知到期末考试答案2024年
- 数学建模与数学软件(山东联盟)智慧树知到期末考试答案2024年
- 生物化学实验(齐鲁工业大学)智慧树知到期末考试答案2024年
- MOOC 创新创业学-西安工业大学 中国大学慕课答案
- 北京市东城区2022-2023学年八年级上学期期末统一检测 数学试卷 (解析版)
- MOOC 财务报表分析-华中科技大学 中国大学慕课答案
- 2024年中考语文复习:古代散文分类练习题汇编 (含答案解析)
- 2024年国家统计服务中心招聘历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 江苏省南通市海安市2023-2024学年八年级上学期期末数学试题含答案解析
评论
0/150
提交评论