Correct rendering of cat images.
This commit is contained in:
@@ -47,17 +47,18 @@ void PNGDumper::dump(const LayerData &layerData)
|
|||||||
void PNGDumper::dumpImageSeries(const LayerData &layer)
|
void PNGDumper::dumpImageSeries(const LayerData &layer)
|
||||||
{
|
{
|
||||||
const auto& shape = layer.shape();
|
const auto& shape = layer.shape();
|
||||||
const auto imagePixels = shape[2] * shape[3];
|
const auto images = shape[0], channels = shape[1], height = shape[2], width = shape[3];
|
||||||
|
const auto imagePixels = width * height;
|
||||||
|
|
||||||
// Buffer for storing the current image data.
|
// Buffer for storing the current image data.
|
||||||
vector<DType> buffer(imagePixels);
|
vector<DType> buffer(imagePixels);
|
||||||
|
|
||||||
auto data = layer.data();
|
auto data = layer.data();
|
||||||
|
|
||||||
png::image<png::gray_pixel> image(shape[2], shape[3]);
|
png::image<png::gray_pixel> image(width, height);
|
||||||
|
|
||||||
for (int i = 0; i < shape[0]; ++i) {
|
for (int i = 0; i < images; ++i) {
|
||||||
for (int j = 0; j < shape[1]; ++j) {
|
for (int j = 0; j < channels; ++j) {
|
||||||
memcpy(buffer.data(), data, imagePixels * sizeof(DType));
|
memcpy(buffer.data(), data, imagePixels * sizeof(DType));
|
||||||
|
|
||||||
// advance the buffer;
|
// advance the buffer;
|
||||||
@@ -65,9 +66,9 @@ void PNGDumper::dumpImageSeries(const LayerData &layer)
|
|||||||
|
|
||||||
clamp(buffer.begin(), buffer.end(), 0.0, 255.0);
|
clamp(buffer.begin(), buffer.end(), 0.0, 255.0);
|
||||||
|
|
||||||
for (int y = 0; y < shape[2]; ++y) {
|
for (int y = 0; y < height; ++y) {
|
||||||
for (int x = 0; x < shape[3]; ++x) {
|
for (int x = 0; x < width; ++x) {
|
||||||
image[x][y] = png::gray_pixel((int) buffer[x + y * shape[3]]);
|
image[y][x] = png::gray_pixel((int) buffer[x + y * width]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,11 +91,11 @@ namespace fmri
|
|||||||
typename std::iterator_traits<It>::value_type minimum,
|
typename std::iterator_traits<It>::value_type minimum,
|
||||||
typename std::iterator_traits<It>::value_type maximum)
|
typename std::iterator_traits<It>::value_type maximum)
|
||||||
{
|
{
|
||||||
const auto extremes = std::minmax(begin, end);
|
const auto[minElem, maxElem] = std::minmax(begin, end);
|
||||||
const auto diff = *extremes.second - *extremes.first;
|
const auto diff = *maxElem - *minElem;
|
||||||
|
|
||||||
const auto offset = minimum - *extremes.first;
|
const auto offset = minimum - *minElem;
|
||||||
const auto scaling = diff / (maximum - minimum);
|
const auto scaling = (maximum - minimum) / diff;
|
||||||
|
|
||||||
std::for_each(begin, end, [offset, scaling] (typename std::iterator_traits<It>::reference v) { v = (v + offset) * scaling;});
|
std::for_each(begin, end, [offset, scaling] (typename std::iterator_traits<It>::reference v) { v = (v + offset) * scaling;});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user