C#里把图片灰度化: 先是用以下代码, 能转换, 但经测试性能比较低, 在窗口中预览灰度化的采集视频, 相当卡顿, 这是因为在两重循环里大量调用GetPixel和SetPixel
private Bitmap rgb2gray(Bitmap bm) { //Row-wise iteration through the Bitmap for (int y = 0; y < bm.Height; y++) { for (int x = 0; x < bm.Width; x++) { Color pixelColor = bm.GetPixel(x, y); int pixelLuminance = (int)(pixelColor.R * 0.2126 + pixelColor.G * 0.7152 + pixelColor.B * 0.0722); bm.SetPixel(x, y, Color.FromArgb(pixelLuminance, pixelLuminance, pixelLuminance)); }//for }//for return bm; }//rgb2gray(Bitmap)
经搜索, 在http://stackoverflow.com/questions/1580130/high-speed-performance-of-image-filtering-in-c-sharp 里找到以下代码:
public static void GrayScaleImage(Bitmap image) { if (image == null) throw new ArgumentNullException("image"); // lock the bitmap. var data = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, image.PixelFormat); try { unsafe { // get a pointer to the data. byte* ptr = (byte*)data.Scan0; // loop over all the data. for (int i = 0; i < data.Height; i++) { for (int j = 0; j < data.Width; j++) { // calculate the gray value. byte y = (byte)( (0.299 * ptr[2]) + (0.587 * ptr[1]) + (0.114 * ptr[0])); // set the gray value. ptr[0] = ptr[1] = ptr[2] = y; // increment the pointer. ptr += 3; } // move on to the next line. ptr += data.Stride - data.Width * 3; } } } finally { // unlock the bits when done or when // an exception has been thrown. image.UnlockBits(data); } }
改用以上代码, 经测试, 性能可以, 但是处理后的图片有些问题, 左边的大部分灰度化的区域有栅格, 右边有一小段区域没有灰度化. 这当然难不倒老杨, 老杨感觉是ptr指向的索引不正确的问题, 参考了下其他代码(https://github.com/baobaohuang/Graphic_gray/blob/cd1d9b543762c23a8fc232e21f8de15dd810e8b2/gray/Program.cs , 这个也可以工作, 性能高于最初的代码,但低于上面的代码), 修正代码如下:
public static void GrayScaleImage(Bitmap image) { if (image == null) throw new ArgumentNullException("image"); // lock the bitmap. var data = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); try { unsafe { // get a pointer to the data. byte* ptr = (byte*)data.Scan0; // loop over all the data. for (int i = 0; i < data.Height; i++) { ptr = (byte*)data.Scan0 + i*data.Stride; for (int j = 0; j < data.Width; j++) { // calculate the gray value. byte y = (byte)( (0.299 * ptr[2]) + (0.587 * ptr[1]) + (0.114 * ptr[0])); // set the gray value. ptr[0] = ptr[1] = ptr[2] = y; // increment the pointer. ptr += 3; } } } } finally { // unlock the bits when done or when // an exception has been thrown. image.UnlockBits(data); } }
最后测试, 以上代码效果perfect ! 不过后来发现, 其实两段代码的处理ptr的方式都一样可以, 主要是
var data = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
这里必须用PixelFormat.Format24bppRgb
相关推荐
blurry 快速,高性能的图像处理库。 blurry提供了具有后端的图像处理算法。 在Linux / macos上为amd64 CPU实现优化的处理器安装$ go get github.com/octu0/blurry例子原始图片旋转顺时针旋转0/90/180/270 img , err ...
该文件是交互式 GUI,用于转换从实时视频流中捕获的快照的图像类型。 GUI 包括实时视频显示以及灰度和二进制图像显示。 有 4 个按钮,1.videoinput,2.Preview,3.Grayscale image,4.Bnary image。 视频输入按钮用于...
grayscale.js全网站变灰IE的js代码
Java将彩色图像转换为灰度图,本利用缓冲区图像实现图像的灰化处理
Grayscale_2.zip
Drawing an image in grayscale画位图到一个灰色刻度中(5KB)
这是谷歌插件Grayscale the Web,能够将网页灰色化,可以用作晚上护眼,另外还有个更深层的意义就是纪念祖国最可爱的人。
前端项目-startbootstrap-grayscale,A multipurpose one page Bootstrap theme created by Start Bootstrap
dataset of standard 512x512 grayscale test images_files
VGG_Imagenet_Weights_GrayScale_Images 为灰度图像转换VGG imagenet的预训练权重。 2种方法: 将图像转换为灰度,将灰度通道复制2次以使图像成为3D图像。 将VGG16的第一个卷积层的权重转换为适应灰度图像。 ...
grayscale.js可以将网站修改为黑白界面,该文件已修改,可根据需求修改文件后标签属性 grayscale.js可以将网站修改为黑白界面,该文件已修改,可根据需求修改文件后标签属性
convert rgb to grayscale
网页页面置灰用的工具js,直接在页面中进行引用就OK啦.
数字图像处理(第三版), RC.G RE.W , 电子工业出版社,图片素材
本文提出一个新的图像对比度增强方法,这种基于多组件的直方图均衡化图像增强方法与古典直方图均衡化方法相比多个灰度阈值,以允许连接成分分析两个局部和全局对比度增强和最低畸变图像出现。
一个将图像转换为灰度的简单Java程序。 我之所以编写此程序,是因为我想从事一些我鲜为人知的工作:像素处理。 入门 下载资料库 通过运行cd /File/Path/Of/toGrayscale-master/更改目录 在终端中运行javac Main.java...
grayscale.js 是一个实现网页元素 “灰度” 效果的 js 插件,可以运行在大多数的浏览器中。使用方法参考:https://blog.csdn.net/snans/article/details/128130887
OpenGL3.3_PostProcessing_GrayScale.rar
不同的 RGB 到灰度转换方法 GrayscaleWithColorConvert:使用 java.awt.color.ColorSpace 更改颜色空间。 GrayscaleWithDraImage:使用 TYPE_BYTE_GRAY 图像类型构建新的 BufferedImage,并使用 Graphics2D....
#图像路径名字错误不提示 im=cv2.imread("timg.jpg",cv2.IMREAD_GRAYSCALE) cv2.imwrite('res.jpg',im) ''' cap=cv2.VideoCapture("1EF5013E37956E7EF2D5F935B6107F34.mp4") while True: ret,im=cap.read() cv2....