Как открыть необработанный файл изображения YCbCr в MatLab?

MongoDB 4.0 добавляет оператор агрегации $convert и псевдоним $toString , который позволяет выполнить именно это:

db.getCollection('example').aggregate([
  { "$match": { "example":1 } },
  { "$project": { "_id": { "$toString": "$_id" } } }
])

Основное использование, скорее всего, будет состоять в том, чтобы использовать значение _id в качестве «ключа» в документе.

db.getCollection('example').insertOne({ "a": 1, "b": 2 })

db.getCollection('example').aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": [
        [{ 
          "k": { "$toString": "$_id" },
          "v": {
            "$arrayToObject": {
              "$filter": {
                "input": { "$objectToArray": "$$ROOT" },
                "cond": { "$ne": ["$$this.k", "_id"] }
              }
            }
          }
        }] 
      ]
    }
  }}
])

Который возвращался:

{ 
  "5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}

Который явно показывает строку, как и в другом примере.

Обычно, хотя обычно есть способ сделать «преобразование» в курсор, поскольку документы возвращаются с сервера. Обычно это хорошо, поскольку ObjectId является 12-байтовым двоичным представлением, а не шестью «строками» из 24 символов, которые занимают намного больше места.

В оболочке есть метод .map()

db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )

И у NodeJS есть Cursor.map(), который может сделать то же самое:

let cursor = db.collection('example').find()
    .map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));

while ( await cursor.hasNext() ) {
  let doc = cursor.next();
  // do something
})

И тот же метод существует и в других драйверах (просто не PHP) , или вы можете просто перебирать курсор и преобразовывать содержимое, что, скорее всего, самое лучшее.

1
задан BOB 15 January 2019 в 22:26
поделиться

2 ответа

Как вы сказали «Любая помощь будет признательна» , я подумал, что хотел бы упомянуть, что вы можете просто конвертировать сырой файл YCbCr в PNG, TIFF, JPEG или любой другой файл формата с помощью ImageMagick [ 118], который устанавливается в большинстве дистрибутивов Linux и доступен для macOS и Windows.

Запустите терминал (или командную строку, если под Windows) и преобразуйте YCbCr image.raw в PNG с помощью:

magick -size 1920x1080 -depth 8  YCbCr:image.raw  result.png

Или, скажем, файла CCIR 601 YUV в формате NetPBM PPM :

magick -size 800x600 -depth 8 YUV:image.raw result.ppm
0
ответ дан Mark Setchell 15 January 2019 в 22:26
поделиться

Проигнорируйте этот бит и посмотрите ниже на РЕДАКТИРОВАТЬ:

Я не понимаю, почему вы используете fread? Почему бы не использовать imread, что означает не для чтения изображений? Используя это печально известное исходное изображение , в качестве основы для моего тестового сценария, я мог отобразить YCbCr изображение, как показано в небольшом сценарии ниже.

original = imread("lenna.jpg");
% figure, imshow(original); % if you want to see how the original image looks
YCbCr_version = rgb2ycbcr(original);
% figure, imshow(YCbCr_version);  % if you want to see how the YCbCr image looks
imwrite(YCbCr_version, "out.jpg");

YCbCr_fromFile = imread("out.jpg");
figure, imshow(YCbCr_fromFile);

РЕДАКТИРОВАТЬ:

  • ЕСЛИ у вас есть бинарная версия файла, и вы можете только прочитать ее, используя fread, [1112 ]

, тогда должен работать следующий скрипт:

clc;
clear;
close all;

original = imread("lenna.jpg");
% figure, imshow(original); % if you want to see how the original image looks
YCbCr_version = rgb2ycbcr(original);
% figure, imshow(YCbCr_version);  % if you want to see how the YCbCr image looks

fileID = fopen('out.bin','w');
fwrite(fileID, YCbCr_version, 'uint8');
fclose(fileID);

fileID = fopen('out.bin','r');
fromFile = fread(fileID, 512*600*3, 'uint8=>uint8');
fclose(fileID);
image = reshape(fromFile, 512, 600, 3);
imagesc(image)

Дело в том, что в операции чтения вы должны также указать 3 канала в множителе, поскольку у цветных изображений этот третий размерность, т. е. 512*600*3. Если вы дадите 512*600, как вы делали, у вас не будет информации о цвете. Также необходимо изменить функцию изменения формы, чтобы учесть 3-е измерение. Следовательно, reshape(fromFile, 512,600, 3).

  • Версия YCbCr, загруженная из файла

YCbCr version loaded from the file

0
ответ дан Joey Mallone 15 January 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: