第5章 圖像的變化(本科生)_第1頁
第5章 圖像的變化(本科生)_第2頁
第5章 圖像的變化(本科生)_第3頁
第5章 圖像的變化(本科生)_第4頁
第5章 圖像的變化(本科生)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章

圖像的變化15.1.1-1.顏色反相真彩色顏色反相非真彩色顏色反相25.1.1-1.顏色反相顏色反相是指正相變負相,或負相變正相g=Max-f對于二值圖像Max取值1對于256色的圖像Max取值255。真彩色圖像的3個顏色分量都需進行這樣的運算非真彩色圖像只需修改調(diào)色板單元的數(shù)值演示程序:色調(diào)變化/顏色反相第五章圖象變化.cpp-OnInvertColor()3真彩色圖像的顏色反相BGR

bgrb=255-Bg=255-Gr=255-R4真彩色圖像的顏色反相-反相每個圖象相素每個真彩色圖像像素數(shù)據(jù)的三個顏色分量都作相同的計算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);//得行首址

//真彩色圖像像素數(shù)據(jù)的三個顏色分量作相同的計算

for(nByte=0;nByte<nBytesPerLine;nByte++)

pPixelLine[nByte]=nMold-pPixelLine[nByte]; }}5非真彩色圖像的顏色反相

RGBrgbb=255-Bg=255-Gr=255-R調(diào)色板調(diào)色板6非真彩色圖像顏色反相-反相調(diào)色板非真彩色圖像顏色反相只需修改調(diào)色板單元的數(shù)值

voidInvertPalette(CImage*pImage){

int

i,nColorTableEntries;

RGBQUAD

ColorTabs[256];//調(diào)色板

nColorTableEntries=pImage->GetMaxColorTableEntries();//取調(diào)色板項數(shù)

pImage->GetColorTable(0,nColorTableEntries,ColorTabs);//取調(diào)色板

//非真彩色圖像顏色反相只需修改調(diào)色板單元的數(shù)值

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);//設(shè)置調(diào)色板}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值。變換后的圖像并不是灰階圖像,其數(shù)據(jù)結(jié)構(gòu)還是原來的結(jié)構(gòu),只是它們都取相同值因此外觀為灰色而已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

非真彩色圖像的色調(diào)由調(diào)色板決定,故變換只需在調(diào)色板數(shù)據(jù)中進行調(diào)色板每項數(shù)據(jù)變灰像素數(shù)據(jù)保持不變由于只修改調(diào)色板中的顏色數(shù)據(jù),其強度未必為按序排列,故也不是灰階圖像12非真彩色圖像變黑白

rgbgggg=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11bg=0.30r+0.59g+0.11b

調(diào)色板調(diào)色板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幾何變換-水平鏡像水平鏡像同一行內(nèi)左右對應(yīng)的像素兩兩互換演示程序:圖象變化/幾何變換:水平鏡像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幾何變換-垂直鏡像垂直鏡像(留作作業(yè))同一列內(nèi)上下對應(yīng)的像素兩兩互換

0123012301230123Pixel(i,j)Pixel(i,Height-1-j)(1,2)(1,1)185.2.4幾何變換-整數(shù)倍放大(擴展法)圖像的整數(shù)倍放大是指圖像的1個像素放大成1個n×n的矩形塊,粒子變粗但像素數(shù)量不變。演示程序:圖象變化/幾何變換:放大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整數(shù)倍放大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);//復(fù)制調(diào)色板

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);//復(fù)制像素數(shù)據(jù)

pNewPixel+=nBytesPerPixel; }

pOriginalPixel+=nBytesPerPixel; }}}20幾何變換-整數(shù)倍縮小(跳點法)整數(shù)倍縮小用跳點方式實現(xiàn)(留作作業(yè))012012012345012345Pixel(i,j)Pixel(i/2,j/2)(2,1)(4,2)215.3圖像的非整數(shù)倍縮放由于圖像的離散性,非整數(shù)倍縮放后計算出的坐標值不一定是整數(shù),故需要重新決定整數(shù)坐標值。常用的方法是:最近鄰點法坐標的計算結(jié)果作四舍五入處理,得到它最接近的點的坐標。雙線性內(nèi)插法在xy兩個方向上作線性內(nèi)插,靠得近的像素的權(quán)值取得大,離得遠的像素的權(quán)值取得小。(1,1)(1.67,1.67)335522逆向算法

設(shè)原圖像為f(x,y),幾何變換后的新圖像為g(u,v),則由像素的x、y坐標計算變換后對應(yīng)的u、v坐標的計算稱為正向計算。u=Fu(x,y) (5.6.1)v=Fv(x,y) (5.6.2)為了避免新圖像中像素的遺漏,通常采用逆向算法。坐標轉(zhuǎn)換計算中,u、v應(yīng)遍歷新圖像中的每一個像素。x=Fx(u,v) (5.6.3)y=Fy(u,v) (5.6.4)(1,1)(1.67,1.67)3355正向計算逆向算法23最近鄰點法

坐標的計算結(jié)果作四舍五入處理,得到它最接近的點的坐標。為了防止顏色失真,真彩色圖像的幾何變換只能采用最近鄰點法演示程序:幾何變換/非整數(shù)倍縮放(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雙線性內(nèi)插法

(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)灰階圖像采用雙線性內(nèi)插法實現(xiàn)生成的圖像灰度變化平緩柔和,沒有不連續(xù)的缺點。演示程序:幾何變換/非整數(shù)倍縮放(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幾何變換-旋轉(zhuǎn)順時針旋轉(zhuǎn)90度通過行列數(shù)據(jù)的交換來實現(xiàn)演示程序:圖象變化/幾何變換:順時針旋轉(zhuǎn)90度Program第五章圖象變化.cpp-OnRotate90Clockwise()0120123401234012(2,1)(3,2)Pixel(x,y)Pixel(OldHeigh-1-y,x)OldHeighxyyX?29順時針旋轉(zhuǎn)90度voidRotate90Clockwise(CImage*pNewImage,CImage*pImage){

int

nBytesPerPixel,nWidth,nHeight,nX,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論