当前位置: 首页 > news >正文

C# 图像灰化处理方法及速度对比

图像处理过程中,比较常见的灰化处理,将彩色图像处理为黑白图像,以便后续的其他处理工作。
在面对大量的图片或者像素尺寸比较大的图片的时候,处理速度和性能就显得非常重要,下面分别用3种方式来处理图像数据,得到不同的处理速度差异:
处理效果对比如下:

第一种方式,直接用.net提供的接口来处理,具有较好的兼容性,但是速度较慢:

       /// <summary>/// 用提取像素方法将图像灰化,有最好的兼容性/// </summary>/// <param name="bitmap"></param>/// <returns></returns>private Bitmap CovertPicturePixels(Bitmap bitmap){try{Bitmap newbitmap = bitmap.Clone() as Bitmap;Color pixel;int ret;for (int y = 0; y < newbitmap.Height; y++){for (int x = 0; x < newbitmap.Width; x++){pixel = newbitmap.GetPixel(x, y);ret = (int)(pixel.R * 0.299 + pixel.G * 0.587 + pixel.B * 0.114);newbitmap.SetPixel(x, y, Color.FromArgb(ret, ret, ret));}}return newbitmap;}catch { return null; }}

第二种方法,使用托管内存来直接操作图像数据,速度速度较第一种方法快约30倍,非常明显,但是要根据不同的图片像素格式来处理数据,相对比较麻烦一些,兼容性不好。

 /// <summary>/// 用托管内存方式处理灰度图像,处理速度比CovertPicturePixels快约30倍,要处理不同的位深/// </summary>/// <param name="bitmapSrc">源图像</param>/// <returns></returns>private Bitmap CovertPictureGrayManagedMemory(Bitmap bitmapSrc){try{Bitmap bitmap = bitmapSrc.Clone() as Bitmap;Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);BitmapData bmpdata = bitmap.LockBits(rect, ImageLockMode.ReadWrite, bitmap.PixelFormat); //锁定内存IntPtr ptr = bmpdata.Scan0;int bytes = bitmap.Width * bitmap.Height * 4;byte[] rgbvalues = new byte[bytes];Marshal.Copy(ptr, rgbvalues, 0, bytes); //图像数据拷贝到内存int factor = 4;if (bmpdata.PixelFormat == PixelFormat.Format32bppRgb)   //暂时只支持常见的格式{factor = 4;}else if (bmpdata.PixelFormat == PixelFormat.Format24bppRgb){factor = 3;}else{return null;}double colortemp = 0;for (int i = 0; i < rgbvalues.Length; i += factor){colortemp = rgbvalues[i + 2] * 0.299 + rgbvalues[i + 1] * 0.587 + rgbvalues[i] * 0.114;rgbvalues[i] = rgbvalues[i + 1] = rgbvalues[i + 2] = (byte)colortemp;}Marshal.Copy(rgbvalues, 0, ptr, bytes); //转换后的数据保存回源图像bitmap.UnlockBits(bmpdata);return bitmap;}catch { return null; }}

第三种方式,直接使用指针来操作内存,得到最快的速度(相比托管内存操作方式略快)。

 /// <summary>/// 用非托管内存方式处理灰度图像,处理速度比CovertPictureGrayManagedMemory略快,要处理不同的位深/// </summary>/// <param name="bitmapSrc"></param>/// <returns></returns>private Bitmap CovertPictureGrayUnManagedMemory(Bitmap bitmapSrc){Bitmap newbitmap = bitmapSrc.Clone() as Bitmap;Rectangle rect = new Rectangle(0, 0, newbitmap.Width, newbitmap.Height);BitmapData bmpdata = newbitmap.LockBits(rect, ImageLockMode.ReadWrite, newbitmap.PixelFormat);byte temp;unsafe{byte* ptr = (byte*)(bmpdata.Scan0);int factor = 4;if(bmpdata.PixelFormat == PixelFormat.Format32bppRgb)   //暂时只支持常见的格式{factor = 4;}else if(bmpdata.PixelFormat == PixelFormat.Format24bppRgb){factor = 3;}else{return null;}for (int x = 0; x < bmpdata.Width; x++){for (int y = 0; y < bmpdata.Height; y++){temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]);ptr[0] = ptr[1] = ptr[2] = temp;ptr += factor;}ptr += bmpdata.Stride - bmpdata.Width * factor;  //bmpdata.Stride:一个扫描行的字节数,bmp的一行数据是4的整数倍}}newbitmap.UnlockBits(bmpdata);return newbitmap;}

由于是非安全的内存操作,要在工程启用相关配置:
在这里插入图片描述
文章和代码均为原创,欢迎转载,请注明出处!

相关文章:

C# 图像灰化处理方法及速度对比

图像处理过程中&#xff0c;比较常见的灰化处理&#xff0c;将彩色图像处理为黑白图像&#xff0c;以便后续的其他处理工作。 在面对大量的图片或者像素尺寸比较大的图片的时候&#xff0c;处理速度和性能就显得非常重要&#xff0c;下面分别用3种方式来处理图像数据&#xff0…...

【嵌入式】STM32F031K4U6、STM32F031K6U6、STM32F031K6T6主流ARM Cortex-M0基本型系列MCU规格参数

一、电路原理图 【嵌入式】STM32F031K4U6、STM32F031K6U6、STM32F031K6T6主流ARM Cortex-M0基本型系列MCU —— 明佳达 二、规格参数 1、STM32F031K4U6&#xff08;16KB&#xff09;闪存 32UFQFPN 核心处理器&#xff1a;ARM Cortex-M0 内核规格&#xff1a;32 位单核 速度&a…...

04_学习springdoc与oauth结合_简述

文章目录 1 前言2 基本结构3 需要做的配置 简述4 需要做的配置 详述4.1 backend-api-gateway 的配置4.1.1 application.yml 4.2 backend-film 的配置4.2.1 pom.xml 引入依赖4.2.2 application.yml 的配置4.2.3 Spring Security 资源服务器的配置类 MyResourceServerConfig4.2.4…...

【设计模式】单例模式的7种实现方法

一、饿汉式-线程安全 线程安全&#xff0c;但无法实现实例懒加载策略 /*** 饿汉式* author CC* version 1.0* since2023/10/12*/ public class Singleton {private static final Singleton singleton new Singleton();private Singleton() {}public static Singleton getSin…...

AlphaPose Pytorch 代码详解(一):predict

前言 代码地址&#xff1a;AlphaPose-Pytorch版 本文以图像 1.jpg&#xff08;854x480&#xff09;为例对整个预测过程的各个细节进行解读并记录 python demo.py --indir examples/demo --outdir examples/res --save_img1. YOLO 1.1 图像预处理 cv2读取BGR图像 img [480,…...

日常学习记录随笔-zabix实战

使用zabix结合 实现一套监控报警装置 不管是web开发还是大数据开发 我们的离线项目还是实时项目也好&#xff0c;都需要把我们的应用提交到我们服务器或者容器中去执行 整个应用过程中怎么保证线上整体环境的稳定运行 监控很重要 现在比较主流的就是 普罗米修斯以及zabix 我要做…...

vw+rem自适应布局

开发过程中&#xff0c;我们希望能够直接按照设计图来开发&#xff0c;不管设计图是两倍还是三倍图&#xff0c;能够直接写设计图尺寸而不需要换算&#xff0c;同时有高质的设计图还原度&#xff0c;想想都比较爽。 这里介绍一种使用vw和rem来布局的方案。 该方案思路主要是&am…...

【MySql】mysql之MHA高可用配置及故障切换

一、MHA概念 MHA&#xff08;Master High Availability&#xff09;是一套优秀的Mysql高可用环境下故障切换和主从复制的软件。 MHA的出现就是解决Mysql单点的问题。 Mysql故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大程…...

如何在 Spring Boot 中进行数据备份

在Spring Boot中进行数据备份 数据备份是确保数据安全性和可恢复性的关键任务之一。Spring Boot提供了多种方法来执行数据备份&#xff0c;无论是定期备份数据库&#xff0c;还是将数据导出到外部存储。本文将介绍在Spring Boot应用程序中进行数据备份的不同方法。 方法1: 使用…...

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…...

SpringBoot基于jackson对象映射器扩展mvc框架的消息转换器

在SpringBoot中&#xff0c;可以基于jackson对象映射器扩展mvc框架的消息转换器 具体步骤如下&#xff1a; 1、创建对象映射器&#xff1a; package com.java.demo.common;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.datab…...

计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(matlab代码)

目录 1 主要内容 系统结构 CCPP-P2G-燃气机组子系统 非线性处理缺陷 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》模型&#xff0c;主要实现的是计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度…...

【低代码表单设计器】:创造高效率的流程化办公!

当前&#xff0c;有不少用户朋友对低代码表单设计器挺感兴趣。其实&#xff0c;如果想要实现提质增效的办公效率&#xff0c;创造一个流程化办公&#xff0c;那么确实可以了解低代码技术平台。流辰信息作为服务商&#xff0c;拥有较强的自主研发能力&#xff0c;根据市场的变化…...

26、类型别名

类型别名 顾名思义&#xff0c;其实就是类型类型起别名&#xff08;新起一个名字&#xff09; demo&#xff1a; type Name string; type NameConsole () > string; type NameUnite Name | NameConsole; function getName(n: NameUnite): Name {if( typeof n string)…...

nslookup命令查询指定域名或ingress地址对应的IP地址。举个例子

使用nslookup命令查询指定域名或ingress地址的IP地址时&#xff0c;可以按照以下方式进行操作&#xff1a; 对于域名查询&#xff1a; 复制代码 nslookup www.example.com 这将返回该域名对应的IP地址。 对于ingress地址查询&#xff1a; 复制代码 nslookup your-ingress-a…...

如何设计一个网络爬虫?

网络爬虫也被称为机器人或蜘蛛&#xff0c;它被搜索引擎用于发现网络上的新内容或更新内容。内容可以是网页、图片、视频、PDF文件等。网络爬虫开始时会收集一些网页&#xff0c;然后跟随这些网页上的链接收集新的内容。图9-1展示了爬取过程的可视化示例。 爬虫的作用&#xff…...

风储联合系统的仿真模型研究

摘要 风能是目前国内外应用较为广泛的一种绿色可再生能源&#xff0c;近几年我国风电产业的发展十分迅速。然后&#xff0c;越来越多的风力发电系统建并网&#xff0c;风力发电产生的电能受外界因素影响较大&#xff0c;具有一定的随机性和波动性&#xff0c;给并网后的电力系统…...

JS VUE 用 canvas 给图片加水印

最近写需求&#xff0c;遇到要给图片加水印的需求。 刚开始想的方案是给图片上覆盖一层水印照片&#xff0c;但是这样的话用户直接下载图片水印也会消失。 后来查资料发现用 canvas 就可以给图片加水印&#xff0c;下面是处理过程。 首先我们要确认图片的格式&#xff0c;我们通…...

主动配电网故障恢复的重构与孤岛划分matlab程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文档&#xff1a; A New Model for Resilient Distribution Systems by Microgrids Formation&#xff1b; 主动配电网故障恢复的重构与孤岛划分统一模型&#xff1b; 同时考虑孤岛与重构的配电网故障…...

2023C语言暑假作业day6

1.选择题 1 1、以下叙述中正确的是&#xff08; &#xff09; A: 只能在循环体内和switch语句体内使用break语句 B: 当break出现在循环体中的switch语句体内时&#xff0c;其作用是跳出该switch语句体&#xff0c;并中止循环体的执行 C: continue语句的作用是&#xff1a;在执…...

实战指南:基于快马平台生成Spring Boot电商后端并部署于腾讯云龙虾

最近在做一个电商平台的后端开发项目&#xff0c;需要快速搭建一套完整的API服务。考虑到腾讯云龙虾服务器性价比高&#xff0c;特别适合中小型Web应用部署&#xff0c;我决定用Spring Boot框架来实现。整个过程在InsCode(快马)平台上完成&#xff0c;从代码生成到部署上线一气…...

Mirage Flow 与卷积神经网络(CNN)的跨模态融合应用

Mirage Flow 与卷积神经网络&#xff08;CNN&#xff09;的跨模态融合应用 你有没有想过&#xff0c;让机器不仅能“看见”图片&#xff0c;还能像人一样“理解”并“描述”图片里的故事&#xff1f;比如&#xff0c;给一张复杂的医学影像&#xff0c;它不仅能圈出病灶&#x…...

告别付费IP!手把手教你用ZCU102 PS端DP接口点亮显示器(附参数调试心得)

解锁ZCU102 PS端DisplayPort潜力&#xff1a;零成本实现高效显示输出的实战指南 在嵌入式视觉系统开发中&#xff0c;显示输出往往是项目落地的最后一道关卡。当我在多个Zynq UltraScale MPSoC项目中反复遭遇HDMI IP核的授权困扰和PL端实现的复杂性后&#xff0c;意外发现PS端集…...

巧用Google Maps与ScreenToGif:零行程数据也能轻松生成动态路线图

1. 从零开始制作动态路线图的必备工具 最近有个朋友问我&#xff1a;"想给客户展示项目选址的交通路线&#xff0c;但实地考察还没开始&#xff0c;怎么做出专业的动态路线图&#xff1f;"这让我想起自己两年前第一次做商业提案时的窘境——当时为了展示物流配送路线…...

快捷键冲突终结者:Hotkey Detective全方位排障指南

快捷键冲突终结者&#xff1a;Hotkey Detective全方位排障指南 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 问题诊断&#xff1a;你的快捷键为…...

弦音墨影保姆级教程:解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题

弦音墨影保姆级教程&#xff1a;解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题 1. 系统简介与核心价值 「弦音墨影」是一款将人工智能技术与传统美学完美融合的视频分析工具。它采用水墨丹青的视觉风格&#xff0c;通过先进的Qwen2.5-VL多模态技术&#xff0c;让视频…...

GSTC甘特图组件:从零构建高效项目管理工具

1. 为什么你需要GSTC甘特图组件&#xff1f; 如果你正在开发一个项目管理工具&#xff0c;或者需要为现有系统添加任务排期功能&#xff0c;甘特图几乎是绕不开的核心组件。传统做法是自己从头开发&#xff0c;但光是处理时间轴渲染、任务拖拽、依赖关系这些基础功能就可能耗费…...

零基础实战:揭秘Python漫画下载器高效收藏完整指南

零基础实战&#xff1a;揭秘Python漫画下载器高效收藏完整指南 【免费下载链接】copymanga-downloader 使用python编译exe/bash/命令行参数来下载copymanga(拷贝漫画)中的漫画&#xff0c;支持批量选话下载和获取您收藏的漫画并下载&#xff01;(windows&linux支持&#xf…...

嵌入式开发代码版本比较工具与技巧

1. 嵌入式开发中的代码版本差异查看方法在嵌入式开发过程中&#xff0c;代码版本管理是每个工程师必须掌握的核心技能。随着项目迭代和功能更新&#xff0c;我们经常需要比较不同版本代码之间的差异&#xff0c;无论是为了代码审查、问题排查还是版本合并。作为一名嵌入式开发者…...

OpenLara最佳实践:开发高质量游戏引擎的10个关键原则

OpenLara最佳实践&#xff1a;开发高质量游戏引擎的10个关键原则 【免费下载链接】OpenLara Classic Tomb Raider open-source engine 项目地址: https://gitcode.com/gh_mirrors/op/OpenLara OpenLara作为一款经典古墓丽影开源引擎&#xff0c;凭借跨平台设计和高效渲染…...