




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消化内科晨间护理规范
- 肺纤维化病人护理常规
- 颐和园英文介绍课件
- 颊癌护理课件
- 颈椎病中医理论课件
- 小儿重症肺炎的护理要点
- 颅骨骨折护理
- 预防职业危害课件
- 国家2030健康规划实施纲要
- 预防小学生沉溺网络课件
- DBJ50T-098-2019 城市绿化养护质量标准
- 消防接警调度(一级)理论考试题库(含答案)
- 教材教法基础培训
- DB3301T 0410-2023 城市河道生态清淤管理规范
- 9.1 浮力(课件)2024-2025学年沪粤版物理八年级下册
- 《蔬菜嫁接技术》课件
- GB/T 2982-2024工业车辆充气轮胎规格、尺寸、气压与负荷
- DB52T 046-2018 贵州省建筑岩土工程技术规范
- 《义务教育语文课程标准》(2022年版)
- DB11T 211-2017 园林绿化用植物材料 木本苗
- 第九章和第十章+静电场+单元测试卷- 高二上学期物理人教版(2019)必修第三册
评论
0/150
提交评论