将灰度图像中的对象编写为零一数组[]

问题描述 投票:0回答:1

我正在尝试将捕获的图像中的灰度对象编写为 0 1 的矩阵,表示对象像素块(或类似对象样式缩放的东西),我可以想象通过循环对象、缩放和编写的手动处理根据颜色等级的矩阵, 但是我正在寻找智能或开源工具,

.NET优先,

[更新,更详细地解释]

原始图像是彩色的,但是,我将其转换为 256 灰度,然后我想将其缩放为仅黑色或白色,所以最终它只是一张黑白图片,我想将其转换为零-一个矩阵,

以下网址包含如何使用名为 imagemagick 的软件将黑白图片转换为零一矩阵的讨论:

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

注意零一矩阵,它展示了龙脸图像!,有没有任何技术或开源工具可以帮助我实现这一目标?

image-processing computer-vision image-recognition object-recognition mathematical-morphology
1个回答
3
投票

像下面这样使用 Emgu OpenCV for .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)

还要进行阈值处理(从彩色到灰度到黑白的转换),您可以使用 Otsu 的阈值处理方法,使用

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);    

其他可能的工具包括

    来自 ImageMagick 的
  • convert
    和来自 netpbm 的
    pnmoraw
    ,如您链接的 URL 中所述,并附有示例片段
    convert lib/dragon_face.xbm pbm: | pnmnoraw
  • 使用 PIL(Python 图像库)迭代图像数据并使用 Python IO 函数写入输出数据
  • 使用 System.Drawing.Bitmap 特别是 GetPixel 方法来迭代图像数据,并使用 C# IO 函数写入输出数据。
© www.soinside.com 2019 - 2024. All rights reserved.