C#图像处理教程 C# Tutorials for image processing

In this section i will provide you some basic examples for image processing using C#


Example 1:
Get the RGB and Luminosity histograms using the default C# classes


  public static int[][] Histogram_CSharp(Bitmap SourceImage)
        {
            int[][] RGBColor = { new int[256], new int[256], new int[256], new int[256] };
            int width = SourceImage.Width, height = SourceImage.Height;
            byte Red, Green, Blue;
            Color pixelColor;


            for (int i = 0, j; i < width; ++i)
                for (j = 0; j < height; ++j)
                {
                    pixelColor = SourceImage.GetPixel(i, j);
                    Red = pixelColor.R;
                    Green = pixelColor.G;
                    Blue = pixelColor.B;
                    ++RGBColor[0][(int)(0.114 * Blue + 0.587 * Green + 0.299 * Red)];
                    ++RGBColor[1][Red];                             // Red
                    ++RGBColor[2][Green];                         // Green
                    ++RGBColor[3][Blue];                            // Blue
                }
            return RGBColor;
        }



Get the RGB and Luminosity histograms using unsafe code


int[][] RGBColor = { new int[256], new int[256], new int[256], new int[256] };   
// [Luminosity, Red, Green, Blue]
            int width = SourceImage.Width, height = SourceImage.Height;
            bool imagGrayscale = (SourceImage.PixelFormat == PixelFormat.Format8bppIndexed);
            BitmapData srcData = SourceImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly,
                (imagGrayscale ? PixelFormat.Format8bppIndexed : PixelFormat.Format24bppRgb));    // lock bitmap data


            unsafe
            {
                byte* ptr = (byte*)srcData.Scan0.ToPointer();
                int pointrInc = imagGrayscale ? 1 : 3;
                int remain = srcData.Stride - width * pointrInc;


                for (int i = 0, j; i < height; ++i, ptr += remain)
                    for (j = 0; j < width; j++, ptr += pointrInc)
                    {
                        if (imagGrayscale == false)
                        {
                            ++RGBColor[0][(int)(0.114 * ptr[0] + 0.587 * ptr[1] + 0.299 * ptr[2])];   
                            ++RGBColor[1][ptr[2]];                        // R
                            ++RGBColor[2][ptr[1]];                       // G
                            ++RGBColor[3][ptr[0]];                       // B
                        }
                        else ++RGBColor[0][ptr[0]];                   // L
                    }
            }
            SourceImage.UnlockBits(srcData);
            return RGBColor;
        }




Example 2:  
Load Image using Unsafe Code, read the image and get the pixels information in several tables. Then plot the histograms in a  ZedGraphControl  Control.
Available Histograms: Luminosity, Red, Green, Blue  Available Filters: Negative, Median, Max, Min, Max/Min, Equalization, Log





Example 3: 
Download an example application, in which we describe the retrieval procedure using CEDD, FCTH and the MPEG-7 Descriptors.  

example

Download Example 3

Example 4:   Image Processing in Windows Presentation Foundation (.NET Framework 3.0)

Many image processing researchers which they develop on .NET/C# they still stuck in GDI+. That means, they still using the unsafe bracket and by pointers they get the image information. This has changed since the introduction of the Windows Presentation Foundation (WPF) for .NET Framework 3.0 and beyond. In this blog post, we will discuss how to open and process an image using the WPF tools. Let's consider that the image.png is a 32bits/pixel color image. To access the image pixels:

PngBitmapDecoder myImage = new PngBitmapDecoder(new Uri("image.png"), BitmapCreateOptions.DelayCreation,BitmapCacheOption.OnLoad);byte[] myImageBytes = new byte [myImage.Frames[0].PixelWidth * 4 * myImage.Frames[0].PixelHeight];
myImage.Frames[0].CopyPixels(myImageBytes, myImage.Frames[0].PixelWidth * 4, 0);

At first line, a image object is created by using the pngbitmapdecoder class. The myImage.Frames collection holds the image information. In this example, an image is opened so the collection is equal to 1 and the picture is accessed by the myImage.Frames[0].

Then a byte array is created which it will hold the image pixels information. The CopyPixels function of the Frames[0] is used to get the pixels of the opened image. In this particular example because the image format is Bgra32, the array byte size is equal to 4*Width*Height. In general, the ordering of bytes in the bitmap corresponds to the ordering of the letters B, G, R, and A in the property name. So in Bgra32 the order is Blue, Green, Red and Alpha. Generally, the image format for the image is accessed by myImage.Frames[0].Format and the palette (if the image is using one) by myImage.Frames[0].Palette.
To manipulate the image pixels in order to create a greyscale image:

int Width = myImage.Frames[0].PixelWidth;
int Height = myImage.Frames[0].PixelHeight;
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
int r = myImageBytes[4 * x + y * (4 * Width) + 2];
int g = myImageBytes[4 * x + y * (4 * Width) + 1];
int b = myImageBytes[4 * x + y * (4 * Width) + 0];
int greyvalue = (int)(0.3 * r + 0.59 * g + 0.11 * b);
myImageBytes[4 * x + y * (4 * Width) + 2] = (byte)greyvalue;
myImageBytes[4 * x + y * (4 * Width) + 1] = (byte)greyvalue;
myImageBytes[4 * x + y * (4 * Width) + 0] = (byte)greyvalue;
}
}


Finally, to create a new image object from the byte array and save it:

BitmapSource myNewImage = BitmapSource.Create(Width, Height, 96, 96, PixelFormats.Bgra32, null, myImageBytes, 4 * Width);BmpBitmapEncoder enc = new
BmpBitmapEncoder();
enc.Frames.Add(
BitmapFrame.Create(myNewImage));FileStream fs = newFileStream("newimage.png"FileMode.Create);
enc.Save(fs);
fs.Close();


A BitmapSource object is created with the corresponding Width, Height and PixelFormat. Then a bmp encoder object is created to save the image as bmp format. A frame is added and the encoder save the image to the corresponding stream.
These programming tools for image manipulation are only a subset of those that they are available in WPF. For example is the WriteableBitmap Class which it is not an immutable object, suitable for dynamic images.

from: http://savvash.blogspot.com/p/c-tutorials.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值