我正试图将捕获图像中的灰度对象脚本化为0 1的矩阵,该矩阵表示对象像素块(或类似于对象样式缩放的东西),我可以想象通过循环对象、根据颜色等级缩放和写入矩阵来进行手动处理,然而,我正在寻找智能或开源工具,
.NET是首选,
【更新,详细解释】
原始图像是彩色的,然而,我将其转换为256灰度,然后我只想将其缩放为黑色或白色,所以在一天结束时,它只是一张黑白图片,我想将其转换成零一矩阵,
下面的url讨论了如何使用名为imagemagick:的软件将黑白图片转换为零一矩阵
http://studio.imagemagick.org/discourse-server/viewtopic.php?f=1&t=18433
注意Zero one矩阵,它展示了一个龙脸图像!,有什么技术或开源工具可以帮助我实现这一点吗?
使用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。
为了加载和使用灰度图像CCD_ 1变成CCD_if (img.Data[i,j,0] == 255)
。
此外,为了进行阈值处理(从彩色到灰度到黑白的转换),您可以使用cvThreshold
方法使用Otsu的阈值处理,使用类似于的方法
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函数来写入输出数据