2016-06-07 5 views
0

Для масштабирования растрового изображения в 3 раза больше, я реализовал этот код и нашел отверстия. Я решил использовать билинейную интерполяцию, и это выше, код, исправляющий ближайший пиксель, вес которого рассчитывается как этот код. Выход [j * hInfo.biWidth + i] = Изображение [3/2 * j * hInfo.biWidth + 3/1 * i].
Логика проста, поэтому я думал, что она будет работать правильно, я был совершенно уверен, но результат изображения выглядит как арбуз, как я себя чувствую, пожалуйста, взгляните на код. любые комментарии приветствуются. Спасибо за прочтение.C++, билинейная интерполяция для исправления дыр на увеличенном растровом изображении

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); 
} 
+0

'void main' никогда не был действительным C или C++. Это затрудняет для читателей копирование и вставку кода, чтобы попробовать, поскольку только один широко используемый компилятор принимает его, и он учит вредным привычкам начинающих. Пожалуйста, не отправляйте код с 'void main'; исправленный. –

+0

Кроме того, перед отправкой, пожалуйста, отформатируйте свой код с * согласованным отступом *. Бесплатные инструменты, такие как AStyle, могут сделать это для вас. Также многие редакторы программистов могут сделать это за вас, но лучше всего просто форматировать код правильно, когда вы его пишете. Я предлагаю вам теперь откорректировать код и перенаправить его. Без каких-либо других изменений. –

+0

Кажется, вы установили 'Output [x] = Image [y]', то есть интерполированное значение не было интерполировано, а другое - в другом месте. Не должно быть что-то вроде 'Output [x] = Изображение [y] * (1/3) + Изображение [z] * (2/3)', т.е. 'Image' должно появиться (по крайней мере) дважды справа боковая сторона? –

ответ

0

Благодаря вам все ребята, я, наконец, сделал с кодом. да, мне не нужен else, если те, которые уже ограничены условием цикла for.

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)Output[i*hInfo.biWidth+j-1]*2/3+(int)Output[i*hInfo.biWidth+j+2]*1/3; 
     } 
     else if(j%3 == 2) 
     { 
      Output[i*hInfo.biWidth+j] = (int)Output[i*hInfo.biWidth+j-1]*1/3 + (int)Output[hInfo.biWidth*i + (j-2)]*2/3; 
     } 

    } 
} 
for(int i= 0 ; i < hInfo.biHeight; i++){  
    for(int j= 0; j < hInfo.biWidth; j++){  
     if(j%3 == 1) 
     { 
      Output[j*hInfo.biWidth+i] = (int)Output[(j-1)*hInfo.biWidth+i]*2/3+(int)Output[(j+2)*hInfo.biWidth+i]*1/3; 
     } 
     else if(j%3 == 2) 
     { 
      Output[j*hInfo.biWidth+i] = (int)Output[(j-1)*hInfo.biWidth+i]*1/3 + (int)Output[hInfo.biWidth*(j-2) + i]*2/3; 
     } 
    } 
} 
Смежные вопросы