Создание сценариев объектов в полутоновых изображениях в виде массива ноль один [] - PullRequest
1 голос
/ 21 марта 2012

Я пытаюсь записать объект в градациях серого в захваченном изображении в виде матрицы 0 1, которая представляет собой блок пикселей объекта (или что-то вроде масштабирования стиля объекта), я могу представить себе ручную обработку путем зацикливания объекта, масштабирования иписать матрицу в соответствии с классом цвета, однако я ищу интеллектуальные инструменты или инструменты с открытым исходным кодом,

.NET предпочтительнее,

[Обновить, чтобы объяснить более подробно]

Исходные изображения цветные, но я конвертирую их в 256 оттенков серого, затем я хочу масштабировать их только на черный или белый, так что в конце дня это просто черно-белое изображение, которое я хочу преобразоватьэто матрица с нулем один,

следующий URL содержит обсуждение того, как преобразовать черно-белое изображение в матрицу с нулем один, используя программное обеспечение imagemagick:

http://studio.imagemagick.org/discourse-server/viewtopic.php?f=1&t=18433

обратите внимание на матрицу Ноль один, которая демонстрирует изображение лица дракона !, есть ли какие-либо методы или инструменты с открытым исходным кодом, которые помогают мне достичь этого?

1 Ответ

3 голосов
/ 25 марта 2012

Примерно следующее использование Emgu OpenCV для .NET будет работать.

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System;
using System.Drawing;
using System.IO;

using (Image<Bgr, Byte> img = new Image<Bgr, Byte>("MyImage.jpg")) 
{
    Matrix<Int32> matrix = new Matrix<Int32>(img.Width, img.Height);

    for (int i = 0; i<img.Height;i++)
    {
       for (int j = 0; j<img.Width;j++)
       {
           if (img.Data[i,j,2] == 255 && 
               img.Data[i,j,1] == 255 && 
               img.Data[i,j,0] == 255)
           {
               matrix.Data[i,j] = 0;
           }
           else 
           {
               matrix.Data[i,j] = 1;
           }
       }
    }

    TextWriter tw = new StreamWriter("output.txt");
    for (int i = 0; i<img.Height;i++)
    {
       for (int j = 0; j<img.Width;j++)
       {
           tw.Write(matrix.Data[i,j]);
       }
       tw.Write(tw.NewLine); 
    }


}

Обратите внимание, что приведенный выше фрагмент загружает цветные изображения и создает матрицу с белым цветом как 0 и 1 в противном случае.

Для загрузки и работы с изображениями в оттенках серого Image<Bgr, Byte> становится Image<Gray, Byte>, и сравнение упрощается до if (img.Data[i,j,0] == 255).

Кроме того, для выполнения установки порога (преобразования цвета в оттенки серого в черно-белое) вы можете использовать определение порога Оцу с помощью метода cvThreshold, используя что-то вроде:

int threshold = 150;
Image<Bgr, Byte> img = new Image<Bgr, Byte>("MyImage.jpg");
Image<Gray, Single> img2 = img1.Convert<Gray, Single>();
Image<Gray, Single> img3 = new Image<Gray, Single>(img2.Width, img2.Height);
CvInvoke.cvThreshold(img2, img3, threshold, 255, THRESH.CV_THRESH_OTSU);    

Другие возможные инструменты включают

  • convert из ImageMagick и pnmoraw из netpbm, как указано в URL-адресе, который вы указали, с примером фрагмента convert lib/dragon_face.xbm pbm: | pnmnoraw.
  • Использование PIL (библиотека изображений Python) для перебора данных изображения и функции ввода-вывода Python для записи выходных данных
  • Использование System.Drawing.Bitmap , в частности, метод GetPixel для перебора данных изображения и функции C # IO для записи выходных данных.
...