C ++如何通过丢弃像素来最好地缩放图像
C++ How to best scale image by dropping pixels
我正在从分辨率为 102 x 77 的成像器捕获一帧数据。我想将其下采样到 80 x 60。质量不是主要问题,但实施的难易程度和速度才是。
我相信我可以通过大约每 4 个像素丢弃一次来完成此操作:
>>> 80.0 / 102.0
0.7843137254901961
>>>
>>> 60.0 / 77.0
0.7792207792207793
>>>
>>> 102 * ( 0.75 )
76.5
>>> 77 * ( 0.75 )
57.75
因为它不正好是 4,我该如何计算?减少获得 80 x 60 所需的像素数的最佳方法是什么?谢谢。
我迭代像素的代码:
// Initialize data store for frame pixel data
vector<quint8> data;
data.resize(frame.getHeight() * frame.getWidth());
// Try to get a frame
forever
{
// Request a frame and check return status
if ( !getRawFrame(frame) ) {
qDebug() << "************************";
qDebug() << "Failed Capture Attempt!";
qDebug() << "************************";
// Failed - try again
continue;
}
// Get the height and width
int h = frame.getHeight();
int w = frame.getWidth();
// Get the frame raw data
vector<quint8> rawdata = frame.getRawData();
// Iterate the pixels
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
// Extract
quint8 pixelValue = reinterpret_cast<quint8*>(rawdata.data())[y*w+x];
int convertToInt = int(pixelValue);
/// do stuff on pixel data
// Downconvert
pixelValue = convertToInt;
// Assign
data[y*w+x] = pixelValue;
}
}
// Assign the data to the Frame now
frame.setData(data);
// Done with capture loop
break;
}
像素下降后分辨率低于所需分辨率显然不是您想要的。而且由于您不能神奇地恢复一些像素,所以我首先会尝试不丢弃那么多像素。
在这种情况下,我的方法是每五个像素丢弃一次。
这将为您提供 81x61 的分辨率。现在你可以再删除 1 行和一列像素,你就完成了。这是我能想到的最快最简单的了。
我正在从分辨率为 102 x 77 的成像器捕获一帧数据。我想将其下采样到 80 x 60。质量不是主要问题,但实施的难易程度和速度才是。
我相信我可以通过大约每 4 个像素丢弃一次来完成此操作:
>>> 80.0 / 102.0
0.7843137254901961
>>>
>>> 60.0 / 77.0
0.7792207792207793
>>>
>>> 102 * ( 0.75 )
76.5
>>> 77 * ( 0.75 )
57.75
因为它不正好是 4,我该如何计算?减少获得 80 x 60 所需的像素数的最佳方法是什么?谢谢。
我迭代像素的代码:
// Initialize data store for frame pixel data
vector<quint8> data;
data.resize(frame.getHeight() * frame.getWidth());
// Try to get a frame
forever
{
// Request a frame and check return status
if ( !getRawFrame(frame) ) {
qDebug() << "************************";
qDebug() << "Failed Capture Attempt!";
qDebug() << "************************";
// Failed - try again
continue;
}
// Get the height and width
int h = frame.getHeight();
int w = frame.getWidth();
// Get the frame raw data
vector<quint8> rawdata = frame.getRawData();
// Iterate the pixels
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
// Extract
quint8 pixelValue = reinterpret_cast<quint8*>(rawdata.data())[y*w+x];
int convertToInt = int(pixelValue);
/// do stuff on pixel data
// Downconvert
pixelValue = convertToInt;
// Assign
data[y*w+x] = pixelValue;
}
}
// Assign the data to the Frame now
frame.setData(data);
// Done with capture loop
break;
}
像素下降后分辨率低于所需分辨率显然不是您想要的。而且由于您不能神奇地恢复一些像素,所以我首先会尝试不丢弃那么多像素。
在这种情况下,我的方法是每五个像素丢弃一次。
这将为您提供 81x61 的分辨率。现在你可以再删除 1 行和一列像素,你就完成了。这是我能想到的最快最简单的了。