0
爲了將位圖圖像縮放3倍,我實現了這個代碼並找到了漏洞。我決定使用雙線性插值,上面這些代碼修補了像這個代碼一樣計算重量的最近像素。輸出[j * hInfo.biWidth + i] =圖像[3/2 * j * hInfo.biWidth + 3/1 * i]。
邏輯很簡單,所以我認爲它會正常工作,我非常確定,但Image的結果看起來像我感覺的西瓜,請看看代碼。任何意見都歡迎。謝謝閱讀。C++,Bilinear Interpolation來修補位圖上的孔Image
void main()
{
BITMAPFILEHEADER hf;
BITMAPINFOHEADER hInfo;
RGBQUAD hRGB[256];
FILE *fp;
fp = fopen("input.bmp", "rb");
if(fp == NULL) return;
fread(&hf, sizeof(BITMAPFILEHEADER), 1, fp);
fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, fp);
fread(hRGB, sizeof(RGBQUAD), 256, fp);
hInfo.biWidth *=3;
hInfo.biHeight *=3;
int ImgSize = hInfo.biWidth * hInfo.biHeight;
BYTE *Image = (BYTE *) malloc(ImgSize);
BYTE *Output = (BYTE *)malloc(ImgSize);
fread(Image, sizeof(BYTE), ImgSize, fp);
fclose(fp);
double Sx, Sy;
scanf("%lf", & Sx);// scaling factor x : 3
scanf("%lf", & Sy);// scaling factor y : 3
for(int i= 0 ; i < hInfo.biHeight; i++){
for(int j=0; j < hInfo.biWidth; j++){
if(j*Sx < hInfo.biWidth && i*Sy<hInfo.biHeight)
Output[(int)(i*Sy)*hInfo.biWidth+(int)(j*Sx)] = Image[i*hInfo.biWidth + j];
}
}
// horizontally executed first.
for(int i= 0 ; i < hInfo.biHeight; i++){
for(int j=0; j < hInfo.biWidth; j++){
if(j%3 == 1)
{
Output[i*hInfo.biWidth+j] = (int)Image[((hInfo.biWidth*(1/3) + j+2) + (hInfo.biWidth* (2/3) + (j-1)))];
}
else if(j%3 == 2)
{
Output[i*hInfo.biWidth+j] = (int)Image[((hInfo.biWidth*(2/3) + j+1) + (hInfo.biWidth* (1/3) + (j-2)))];
}
else if( j%3 ==1 && j+2 >= hInfo.biWidth)
{
Output[i*hInfo.biWidth+j] = Image[i*hInfo.biWidth + (j-2)] ;
}
else if( j%3 ==2 && j+1 >= hInfo.biWidth)
{
Output[i*hInfo.biWidth+j] = Image[i*hInfo.biWidth + (j-2)] ;
}
}
}
// vertically executed last
for(int j= 0 ; j < hInfo.biWidth; j++){
for(int i=0; i < hInfo.biHeight; i++){
if(j%3 == 1)
{
Output[j*hInfo.biWidth+i] = Image[hInfo.biWidth*(1/3) + (i+2) + hInfo.biWidth* (2/3) + (i-1);
}
else if(j%3 == 2)
{
Output[j*hInfo.biWidth+i] = Image[hInfo.biWidth*(2/3) + (i+1) + hInfo.biWidth* (1/3) + (i-2)];
}
else if( j%3 ==1 && j+2>=hInfo.biWidth)
{
Output[j*hInfo.biWidth+i] = Image[j*hInfo.biWidth + (i-2)] ;
}
else if( j%3 ==2 && j+1>=hInfo.biWidth)
{
Output[j*hInfo.biWidth+i] = Image[j*hInfo.biWidth + (i-2)] ;
}
}
}
fp = fopen("output.bmp", "wb");
fwrite(&hf, sizeof(BYTE), sizeof(BITMAPFILEHEADER), fp);
fwrite(&hInfo, sizeof(BYTE), sizeof(BITMAPINFOHEADER), fp);
fwrite(hRGB, sizeof(RGBQUAD), 256, fp);
fwrite(Output, sizeof(BYTE),ImgSize, fp);
fclose(fp);
free(Image);
free(Output);
}
'void main'從來沒有被C或C++有效。它使得讀者難以複製和粘貼你的代碼來嘗試它,因爲只有一個常用的編譯器接受它,它教會初學者的不良習慣。請不要用'void main'發佈代碼;糾正。 –
另外,請在發佈之前使用*一致的縮進*格式化您的代碼。像AStyle這樣的免費工具可以爲你做到這一點。許多程序員的編輯也可以爲你做,但最好的方法是在編寫代碼時正確地格式化代碼。我建議你現在縮進代碼並重新發布。沒有任何其他變化。 –
看起來你設置了'Output [x] = Image [y]',即內插值不是真正插值的,而是另一個點在另一個位置。它不應該像'Output [x] = Image [y] *(1/3)+ Image [z] *(2/3)'這樣的東西,即Image應該出現在右邊(至少)兩次側? –