Tag: 图像处理

带通滤波器组

我已经实现了本文中描述的一组定向带通滤波器。 请参阅“ 2.1预处理 ”一节中的最后一段。 我们选择了12个不重叠的滤镜,分析了12个不同的方向,相对于15°相互旋转。 我有以下问题, 滤波器组应该生成12个滤波图像。 但是,实际上,我只有03输出,如下面的快照所示, 源代码: 以下是完整的VS2013解决方案作为压缩文件。 这是源代码中最相关的部分, public class KassWitkinFunction { /* * tx = centerX * cos * ty = centerY * sin * * u* = cos . (u + tx) + sin . (v + ty) * v* = – sin . (u + tx) + cos . […]

将24bpp位图转换为1bpp

我试图转换一个小位图图像。 我想任何不是100%白色的像素都可以转换成黑色。 我试过了 Bitmap output = sourceImage.Clone(new Rectangle(0, 0, sourceImage.Width, sourceImage.Height), PixelFormat.Format1bppIndexed); 在1bpp输出中仍然有一些较亮的像素保持白色。 实现此转换的最快方法是什么? 我可以修改Clone()调用的强度阈值吗?

如何将1D字节数组转换为包含位图的2D字节数组?

我已经使用了LockBits和UnlockBits函数,并将Image的字节数组转换为1D数组。 (仅考虑黑白/二值化图像) 有没有办法将它带到2Darrays(图像高度和宽度的大小)? 所以我可以将数组转换为“.txt”文件并查看它? 我用来将图像转换为1D数组的代码如下: Public void function(Bitmap image){ { byte[] arr1D; byte[] arr2D; BitmapData data = image.LockBits(new Rectangle(0, 0, img_w, img_h), ImageLockMode.ReadOnly, image.PixelFormat); try { IntPtr ptr = data.Scan0; int bytes = Math.Abs(data.Stride) * image.Height; byte[] rgbValues = new byte[bytes]; arr1D = rgbValues; Marshal.Copy(ptr, rgbValues, 0, bytes); } finally { image.UnlockBits(data); } } 由于图像是二进制的,因此字节数组的值仅为255和0。 […]

如何在保持高质量的同时在C#中调整图像大小?

我从这里找到了一篇关于图像处理的文章: http : //www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing一切正常。 我希望在调整图像大小时保持高质量。 我想如果我可以增加DPI值,我可以实现这一点。 有谁知道这是否可能? 如果是这样,我怎样才能在C#中实现它?

C#中的图像处理 – 智能解决方案?

我有一个带有字母的图像,字母有黑色和蓝色两种颜色,我想从图像中读取蓝色字母。 任何人都可以建议我在C#中执行此操作的方法。 我正在研究GDI +,但仍然没有得到任何逻辑来开发这个程序.. 我试过OCR它,但普通OCR的问题是他们不认识色差。 我只想读蓝字…… 任何指导都非常感谢。

不安全的指针迭代和位图 – 为什么UInt64更快?

我一直在做一些不安全的位图操作,并发现增加指针的次数可以带来一些重大的性能提升。 我不知道为什么会这样,即使你在循环中做了更多的按位操作,对指针进行更少的迭代仍然会更好。 因此,例如,使用UInt64迭代超过32位像素,而不是使用UInt64迭代两个像素,并在一个周期内执行两次操作。 以下是通过读取两个像素并对其进行修改(当然,它会因奇数宽度的图像而失败,但仅用于测试)。 private void removeBlueWithTwoPixelIteration() { // think of a big image with data Bitmap bmp = new Bitmap(15000, 15000, System.Drawing.Imaging.PixelFormat.Format32bppArgb); TimeSpan startTime, endTime; unsafe { UInt64 doublePixel; UInt32 pixel1; UInt32 pixel2; const int readSize = sizeof(UInt64); const UInt64 rightHalf = UInt32.MaxValue; PerformanceCounter pf = new PerformanceCounter(“System”, “System Up Time”); pf.NextValue(); BitmapData bd […]

如何使用C#以低分辨率forms提供高分辨率图像

尝试使用300dpi tif图像在网络上显示。 目前,当用户上传图片时,我正在动态创建缩略图。 如果创建的页面引用宽度为500x500px的高分辨率图像,我是否可以使用相同的function即时转换为gif / jpg。 什么是即将解决的jpg将被创建? 编辑: 为了进一步解释该用法,用户上传了大约3000×3000像素的300dpi图像。 用户正在使用这些图像来创建将用于pdf打印的目录页面。 当他们创建页面时,我们只需要72dpi图像显示在屏幕上,但是对于打印,需要300dpi图像。 显然,他们不想在页面上添加3000x3000px图像,因此需要将其调整到正确的查看区域,例如500x500px等。

为什么我的图像看起来采用Bgra而不是Argb的格式?

所以,我对我刚刚运行的快速测试感到非常困惑。 我在C#中进行一些图像处理。 Get / SetPixel()已被certificate太慢了,所以我使用LockBits来获取原始数据。 但是,我似乎遇到了一个我无法弄清楚的情况。 在扫描图像时,似乎每个像素按照顺序布置为Bgra,即蓝色字节,绿色字节,红色字节和alpha。 我的印象是他们将以Argb的顺序排列。 这是我正在使用的代码示例。 BitmapData baseData = m_baseImage.LockBits(new Rectangle(new Point(0, 0), m_baseImage.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Bitmap test = new Bitmap(m_baseImage.Width, m_baseImage.Height); byte* ptr = (byte*)baseData.Scan0; for (int y = 0; y < m_baseImage.Height; ++y) { for (int x = 0; x < m_baseImage.Width; ++x) { // this works, image is copied […]

使用GDI +将修改后的图像保存到原始文件

我正在从文件加载位图图像。 当我试图将图像保存到另一个文件时,我收到以下错误“GDI +中发生了一般错误”。 我相信这是因为文件被图像对象锁定。 好吧,试着调用Image.Clone函数。 这仍然会锁定文件。 哼。 接下来,我尝试从FileStream加载位图图像并将图像加载到内存中,这样GDI +就不会锁定文件。 这很好用,除了我需要使用Image.GetThumbnailImage方法生成缩略图,它抛出一个内存不足的exception。 显然我需要保持流打开以停止此exception,但如果我保持流打开,则文件保持锁定状态。 这种方法没有用。 最后,我创建了该文件的副本。 所以现在我有2个版本的文件。 1我可以在我的c#程序中锁定和操作。 这个其他原始文件保持解锁状态,我可以保存修改。 这样可以让我即使在保存后也可以恢复更改,因为我正在操作无法更改的文件副本。 当然有一种更好的方法来实现这一点,而无需拥有2个版本的图像文件。 有任何想法吗?

C# – 调整图像canvas大小(保持源图像的原始像素尺寸)

我的目标是拍摄一个图像文件并将尺寸增加到下一个2的幂,同时保留像素(也就是不缩放源图像)。 所以基本上最终结果将是原始图像,以及跨越图像右侧和底部的额外白色空间,因此总尺寸是2的幂。 下面是我正在使用的代码; 这会创建具有正确尺寸的图像,但由于某种原因,源数据会略微缩放和裁剪。 // Load the image and determine new dimensions System.Drawing.Image img = System.Drawing.Image.FromFile(srcFilePath); Size szDimensions = new Size(GetNextPwr2(img.Width), GetNextPwr2(img.Height)); // Create blank canvas Bitmap resizedImg = new Bitmap(szDimensions.Width, szDimensions.Height); Graphics gfx = Graphics.FromImage(resizedImg); // Paste source image on blank canvas, then save it as .png gfx.DrawImageUnscaled(img, 0, 0); resizedImg.Save(newFilePath, System.Drawing.Imaging.ImageFormat.Png); 看起来源图像是基于新的canvas大小差异缩放的,即使我使用的是一个名为DrawImageUnscaled()的函数。 请告诉我我做错了什么。