Примерно следующее использование 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 для записи выходных данных.