c# 内存法二值化图像

之前在网上看的一些方法都是通过指针来操作的,下面这个方法是通过c#内存操作的

保存下来,方便以后自己查看

 1    private static Bitmap PBinary(Bitmap src, int v)
 2         {
 3             int w = src.Width;
 4             int h = src.Height;
 5             Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
 6             System.Drawing.Imaging.BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
 7             System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
 8             int stride = srcData.Stride;
 9             var srcBytes = new byte[h * stride];//这个地方通过高度×行跨距来计算需要的数组大小,如果用宽×高×3来计算的话会不准。
10             var dstBytes = new byte[h * stride];
11             IntPtr pIn = srcData.Scan0;
12             IntPtr pOut = dstData.Scan0;
13             Marshal.Copy(pIn, srcBytes, 0, srcBytes.Length);
14
15             for (int i = 0; i < h; i++)
16             {
17                 for (int j = 0; j < srcData.Stride - 3; j = j + 3)//这个地方+3是因为我默认的图片是24位的,24位的一个像素点用三个字节来表示,如果是32位的,则是4个字节来存储。就要改成4
18                 {
19                     var r = srcBytes[i * stride + j + 2];
20                     var g = srcBytes[i * stride + j + 1];
21                     var b = srcBytes[i * stride + j];
22
23                     dstBytes[i * stride + j] = dstBytes[i * stride + j + 1] = dstBytes[i * stride + j + 2] =
24                         (byte)(((byte)(0.2125 * r + 0.7154 * g + 0.0721 * b) >= v) ? 255 : 0);//这个地方是计算出一个像素点的平均灰度,然后判断是否大于阀值。
25                 }
26             }
27             Marshal.Copy(dstBytes, 0, pOut, dstBytes.Length);
28             src.UnlockBits(srcData);
29             dstBitmap.UnlockBits(dstData);          42             return dstBitmap;
44         }
时间: 2024-10-20 12:52:10

c# 内存法二值化图像的相关文章

opencv 删除二值化图像中面积较小的连通域

对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; double tmparea = 0.0; CFileDialog dlg(true); if (dlg.DoModal()==IDOK) { CvMemStorage* storage = cvCreateMemStorage(0); IplImage* img_src= cvLoadImage(

图像处理 基于Visual C++编程 学习笔记 (3)显示灰度图像和二值化图像

灰度图imggray 有了上面的基础,灰度图就相当简单了 彩色图转灰度方法: 1.浮点算法:Gray=R*0.3+G*0.59+B*0.11 2.整数方法:Gray=(R*30+G*59+B*11)/100 3.移位方法:Gray =(R*28+G*151+B*77)>>8;  ??4.平均值法:Gray=(R+G+B)/3; 5.仅取绿色:Gray=G: 这里使用浮点算法 void imggray::showgray(CDC *pDC, CRect rc) { ReadBitData();

ComicEnhancerPro 系列教程十七:二值化图像去毛刺

作者:马健邮箱:[email protected] 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十七:二值化图像去毛刺 在灰度图像处理成纯黑白(二值化)图像以后,经常出现的一个问题是轮廓边缘出现毛刺.如下面这个图像: 为了看得更清楚,放大到800%并加网格线: 可以看出在"工"字的上面一横中,上边缘有几个突出点,下边缘有两个凹陷点,而在"业"字左侧竖条中有突出点,下面一横中有凹陷点. 产生毛刺的原因是

图像灰度变换、二值化、直方图

1.灰度变换 1)灰度图的线性变换 Gnew = Fa * Gold + Fb. Fa为斜线的斜率,Fb为y轴上的截距. Fa>1 输出图像的对比度变大,否则变小. Fa=1 Fb≠0时,图像的灰度上移或下移,效果为图像变亮或变暗. Fa=-1,Fb=255时,发生图像反转. 注意:线性变换会出现亮度饱和而丢失细节. 2)对数变换 t=c * log(1+s) c为变换尺度,s为源灰度,t为变换后的灰度. 对数变换自变量低时曲线斜率高,自变量大时斜率小.所以会放大图像较暗的部分,压缩较亮的部分.

C# 指针操作图像 二值化处理

/// <summary> /// 二值化图像 /// </summary> /// <param name="bmp"></param> /// <returns></returns> private static unsafe Bitmap Binaryzation(Bitmap bmp) { BitmapData dstData = bmp.LockBits(new Rectangle(0, 0, bmp.W

记录一个优秀的图像二值化代码

#region 二值化02 public Bitmap binaryzation(Bitmap srcBitmap, Bitmap dstBitmap) { int threshold = 0; Byte[,] BinaryArray = ToBinaryArray(srcBitmap, out threshold); dstBitmap = BinaryArrayToBinaryBitmap(BinaryArray); return dstBitmap; } /// <summary> //

[转载+原创]Emgu CV on C# (四) —— Emgu CV on 二值化

重点介绍了二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也是很多图像处理技术的预处理过程. 图像的预处理在进行图像二值化操作前要对图像进行预处理,包括彩色图像灰化和增强.由于选取阈值需要参照直方图,因此在图像进行处理后,我们再获取图像的直方图以帮助选取阈值.整个流程如下所示: 读取图像→灰度图像→图像增强→图像直方图→二值化处理 2.数学原理(转载,基本可以不

基于opencv的视频流 模板匹配 (灰度化 二值化 )

#include <cv.h> #include <highgui.h> #include <windows.h> // 获取直方图 // 1. pImageData 图像数据 // 2. nWidth 图像宽度 // 3. nHeight 图像高度 // 4. nWidthStep 图像行大小 // 5. pHistogram 直方图 BOOL GetHistogram(unsigned char *pImageData, int nWidth, int nHeigh

[转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自<OpenCV_基于局部自适应阈值的图像二值化>) 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的.亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适