Уменьшить изображение

Я пытаюсь уменьшить изображение на 2, изображение, которое я предполагал, что оно серое, поэтому я буду работать только с одним каналом, я попытался усреднить 4 пикселя, а затем поместить результат в destImage. Я не знаю, как правильно заполнить DestImage. Пожалуйста, найдите код здесь:

void downsizeRow(unsigned char *srcImage, unsigned char *dstImage, int srcWidth )
{

unsigned char *srcPtr = srcImage;
unsigned char *dstPtr = dstImage;

int stride = srcWidth;
int b;
for (int i = 0; i< 4; i++)
{

b  = srcPtr[0]+srcPtr[1] + srcPtr[stride + 0] + srcPtr[stride + 1] ;

srcPtr++;
dstPtr[0] = (uint8_t)((b + 2)/4);;
dstPtr++;
}

}

void downscaleImage( unsigned char *srcImage, unsigned char *dstImage, int srcWidth, int dstHeight, int dstWidth)
{

unsigned char *srcPtr=srcImage;
unsigned char *dstPtr=dstImage;

int in_stride = dstWidth;
int out_stride = dstHeight;

for (int j=0;j<dstHeight;j++)
{
downsizeRow(srcPtr, dstPtr, srcWidth);  // in_stride is needed
// as the function requires access to iptr+in_stride
srcPtr+=in_stride * 2;
dstImage+=out_stride;
}
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

unsigned char srcimage[4*4];
unsigned char dstimage[2*2];for (int i = 0; i<4*4; i++)
{
srcimage[i] = 25;
}
std::cout<<"source Image \n"<<std::endl;
for (int i = 0; i<4*4; i++)
{

std::cout<<srcimage[i];
}

downscaleImage(srcimage, dstimage, 4,4,2);
std::cout<<"dest Image"<<std::endl;
for (int i = 0; i<2*2; i++)
{

//    std::cout<<dstimage[i];
}

return a.exec();
}

0

Решение

В вашем коде нет ничего плохого — в основном, просто следите за местоположением указателя чтения / записи (не забывайте обновлять по шагам). Это требует использования 2-х вложенных циклов тем или иным способом. (+ установите делитель на 4).

Я нашел следующий подход полезным: обработка по одной строке за раз приводит к небольшому снижению скорости, но позволяет легче интегрировать различные ядра.

iptr=input_image;  in_stride = in_width;
optr=output_image; out_stride = out_width;
for (j=0;j<out_height;j++) {
process_row(iptr, optr, in_width);  // in_stride is needed
// as the function requires access to iptr+in_stride
iptr+=in_stride * 2;
optr+=out_stride;
}
1

Другие решения

Я вижу, что вы используете Qt, так что на всякий случай, если вам не нужно заново изобретать колесо, QImage имеет удобную функцию, которая сделает для вас изменение размера (эффективно понижающую выборку).

QImage smallImage = bigImage.scaled(bigImage.width() / 2, bigImage.heigth() / 2, Qt::KeepAspectRatio, Qt::SmoothTransformation);

В случае, если QImage слишком медленный для вас, вы также можете попробовать использовать QPixmap, который обычно работает быстрее.

Опуская Qt::SmoothTransformation вернется к использованию по умолчанию Qt::FastTransformation что будет еще быстрее.

1

По вопросам рекламы [email protected]