一、概述

本文记录一下使用OpenCVSharp包进行图像处理。包括使用两种方法增强图像对比度、缩放图像、删除透明像素功能。

二、常规方法增强图像对比度

该方法处理速度较慢,但是思路简单,逻辑清晰。

1.下载NuGet包

2.常规方法,for遍历每个像素

/// <summary>
/// 增强图像对比度/// </summary>/// <param name="path">图像路径</param>public void EnhanceImageContrast(string path){//读入的图像是RGB 但是像素顺序是BGRusing (Mat src = Cv2.ImRead(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))using (Mat dst = new Mat(src.Size(), src.Type()))  //修改之后的图像{int height = src.Rows;int width = src.Cols;int cn = src.Channels(); //通道数float alpha = 1.6f; //系数 alpha值越大,像素之间的差值越大,对比度越强烈float beta = 0f;  //增益    beta值是用于提高图片亮度增益值for (int row = 0; row < height; row++){for (int col = 0; col < width; col++){if (cn == 1){float color = src.At<float>(row, col);dst.Set<float>(row, col, color);}else if (cn == 3){Vec3b color = new Vec3b{Item0 = (byte)ControlPixelExtend((int)Math.Ceiling((src.At<Vec3b>(row, col).Item0) * alpha + beta)), //BItem1 = (byte)ControlPixelExtend((int)Math.Ceiling((src.At<Vec3b>(row, col).Item1) * alpha + beta)), //GItem2 = (byte)ControlPixelExtend((int)Math.Ceiling((src.At<Vec3b>(row, col).Item2) * alpha + beta))  //R};dst.Set<Vec3b>(row, col, color);}}}//参数:1 要保存图片的路径 2:图像的矩阵容器 ,(图片保存格式个根据自定义的后缀名)//Cv2.ImWrite(@"C:\Users\deng\Desktop\ExportImages\out.png", dst);using (new Window("dst Image", WindowMode.Normal, dst))using (new Window("src Image", WindowMode.Normal, src)){Cv2.WaitKey(0);}}}

三、使用指针读取图像并增强图像对比度

该方法处理速度较快。

1.将项目设置为允许不安全代码

2.代码

/// <summary>
/// 使用指针快速操作像素,并增强图像对比度
/// </summary>
/// <param name="path">原图像路径</param>
public Mat EnhanceContrastByPointer(string path)
{Mat srcImg = Cv2.ImRead(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);Mat dstImg = srcImg.Clone();//指针方法修改像素值unsafe{float alpha = 2f; //系数 alpha值越大,像素之间的差值越大,对比度越强烈float beta = 1f;  //增益    beta值是用于提高图片亮度增益值for (int i = 0; i < dstImg.Rows; i++){IntPtr ptrColor = dstImg.Ptr(i);for (int j = 0; j < dstImg.Cols; j++){byte* pointerColor = (byte*)ptrColor.ToPointer();  //指针//pointerColor是字节,一个像素值由三个字节存储pointerColor[j * 3] = (byte)ControlPixelExtend((int)Math.Ceiling(pointerColor[j * 3] * alpha + beta));  //RpointerColor[j * 3 + 1] = (byte)ControlPixelExtend((int)Math.Ceiling(pointerColor[j * 3 + 1] * alpha + beta));  //GpointerColor[j * 3 + 2] = (byte)ControlPixelExtend((int)Math.Ceiling(pointerColor[j * 3 + 2] * alpha + beta));  //B}}}return dstImg;
}

四、缩放图像

1.代码

/// <summary>
/// 缩放图像
/// </summary>
/// <param name="path">原图像路径</param>
public void PictureResize(Mat srcImg)
{//函数原型:public Mat Resize(Size dsize, double fx = 0, double fy = 0, InterpolationFlags interpolation = InterpolationFlags.Linear);//dsize:缩放之后的图像大小//fx:宽度缩放比例//fy:高度缩放比例//interpolation:插值方式//注意:缩放图像时,如果dsize中width或者height有一个为0,则使用fx与fy为缩放比例,否则使用dsize为最终缩放图像大小//Mat Zoomout = src.Resize(new Size(src.Width/2, src.Height / 2),0,0,InterpolationFlags.Linear);//缩小//Mat Zoomout = src.Resize(new Size(0, 0), 0.5, 0.5, InterpolationFlags.Linear);//缩小 与上一行效果相同//Mat Zoomin = src.Resize(new Size(src.Width*1.2, src.Height*1.2), 0, 0, InterpolationFlags.Linear);//放大Mat Zoomin = srcImg.Resize(new OpenCvSharp.Size(0, 0), 1.05, 0.98, InterpolationFlags.Linear);//放大 与上一行效果相同//Cv2.ImShow("src image", src);//Cv2.ImShow("Zoomout", Zoomout);//Cv2.ImShow("Zoomin", Zoomin);Cv2.ImWrite(@"C:\Users\deng\Desktop\ExportImages\res11.png", Zoomin);
}

五、删除透明像素

该方法速度较慢。

1.代码

/// <summary>
/// 删除透明像素
/// </summary>
/// <param name="bitmap">待删除透明像素的bitmap</param>
/// <returns>已删除透明像素的bitmap</returns>
public Bitmap DeleteTransparentPixel(Bitmap bitmap)
{int y = 0;   //非透明图像的高度bool isFirstTransparentPixel = true;Color[,] opaquePixel = new Color[bitmap.Width, bitmap.Height];for (int i = 0; i < bitmap.Width; i++){for (int j = 0; j < bitmap.Height; j++){Color c = bitmap.GetPixel(i, j);if (c.A != 0)  //如果不是透明像素opaquePixel[i, j] = c;else{if (isFirstTransparentPixel)  //如果第一次出现透明像素{y = j;   //记录不透明像素的总行数isFirstTransparentPixel = false;break;}}}}Bitmap b = new Bitmap(bitmap.Width, y);for (int i = 0; i < b.Width; i++){for (int j = 0; j < b.Height; j++){b.SetPixel(i, j, opaquePixel[i, j]);}}return b;
}

六、参考链接

1.c#OpenCVSharp指针快速读取像素:https://mp.weixin.qq.com/s/5DStN-5ONEO-OFZ9v0HDUw
2.OpenCvSharp图像亮度和对比度调整(速度较慢):https://blog.csdn.net/weixin_41049188/article/details/90612010
3.OpenCVSharp图像缩放与插值:https://blog.csdn.net/CAI____NIAO/article/details/121571283

c#图像处理(OpenCVSharp)相关推荐

  1. C#图像处理-OpenCVSharp教程(十二) OpenCVSharp图像几何变换:平移、旋转、缩放、转置和镜像等

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp图像几何变换:平移.旋转.缩放.转置和镜像等! 一.图像缩放 // 图像缩放-- - Resize Mat ...

  2. C#图像处理-OpenCVSharp教程(八) OpenCVSharp基本绘图函数:绘制线、圆、矩形、椭圆、文字等

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp基本绘图函数:绘制线.圆.矩形.椭圆.文字等! 实现效果: 代码演示: using System; usin ...

  3. 基于OpenCVSharp的图像处理软件

    目录 1 任务与目的 2 方案总体设计 3 C#界面设计 4 OpenCVSharp功能实现 5 打包与运行 6 总结 1 任务与目的 本次任务是设计一个能够实现OpenCV部分功能的图像处理软件.目 ...

  4. opencvsharp图像处理_腐蚀与膨胀,击中击不中变换(3)

    膨胀:dilate为核B对核A做卷积时,核B覆盖区域的像素最大值提取 腐蚀:erode 为核B对核A做卷积时,核B覆盖区域的像素最小值提取 击中击不中变换:有两个不相交集合B={B1,B2},用B1去 ...

  5. 基于OpenCvSharp的数字图像处理 - 图像彩色类型转换

    创建项目  |  文件与显示  |  像素操作  |  图像彩色类型转换  |  模糊.平滑.去噪  |  锐化.边缘检测  |  二值化  |  形态学  |  位置变换  |  直方图  |  霍 ...

  6. OpencvSharp的踩坑之路

    1.背景 部门的软件课用的是c#,我们图像处理用的c++,c++版的代码要想在c#上运行,通过把C++封装成动态链接库在C#中调用,这样在修改算法的过程中就会非常的不方便,封装DLL的时候也比较麻烦. ...

  7. 图像处理技术(二)滤波去噪

    在图像处理领域中,在真正的应用过程前,通常需要对图像进行预先处理,达到去除干扰项的目的.滤波去噪就是其中的一项图像预处理工作. 在.NET下常用OpenCV进行图像处理工作,常用的.NET下的Open ...

  8. 编程去除背景绿幕抠图,基于.NET+OpenCVSharp

    摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时"抠人像.替换背景"的方式,对于项目中的算法进行了分析.本文中给出了简化OpenCVSharp中Mat.M ...

  9. 基于opencvsharp的景深融合

    C#景深融合 最近因为一个项目要求,将matlab写的一些关于图像的算法转成C#.这个挺坑爹的,C#处理图像还是挺少的,opencv关于这方面的资源挺少的.我用的是opencvsharp这个第三方库, ...

最新文章

  1. 属性为nil的时候测试是否crash  nil是不会崩溃的
  2. 解决python2和python3的pip冲突
  3. python映射类型-Python 的映射数据类型有哪些?零基础小白入门学习必看
  4. ubuntu apache2配置
  5. 最舒适的路线 第六届
  6. python:实例化configparser模块读写配置文件
  7. 鸡肉和鸡蛋–测试前解决Spring属性
  8. 常见25种深度学习模型的github代码
  9. Canal Mysql binlog 同步至 ElasticSearch 详细介绍
  10. NetApp 存储阵列 AFF A 系列——可提供屡获殊荣的速度和响应能力,满足性能敏感性工作负载的需求
  11. 批量保存网页_一键保存网页图片!macOS自带神器,比《快捷指令》还好用
  12. 小猫钓鱼纸牌游戏java_java实现纸牌游戏之小猫钓鱼算法
  13. 对图像高通滤波matlab,高通巴特沃斯滤波器在MATLAB中对图像进行滤波
  14. Error opening dll library错误的解决
  15. 使用Euclid算法求最大公约数
  16. java ldc指令_6.Java JVM_4.JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
  17. Flying-Saucer使用HTML或者FTL(Freemarker模板)生成PDF
  18. VMware Workstation Pro虚拟机安装Windows server 2008 r2
  19. pyecharts图表库学习:Pie(饼图)
  20. shardingsphere读写分离+分表【笔记】

热门文章

  1. 为java程序制作exe
  2. 计算机视觉系列-全球小麦检测Kaggle比赛学习笔记(7)
  3. javaScript和DOM
  4. php 去除字符串中符号,如何从PHP字符串中的字符中删除重音符号?
  5. 力扣-55 跳跃游戏
  6. javascript 正则表达式 字符串 如何匹配 单个 反斜杠
  7. 联想小新16Pro待机或者关机后无网络问题(WiFi显示不出来)
  8. “魏武王”称谓的合理性
  9. 小白自学笔记——JAVA基础 1.5API文档说明
  10. 微信小程序循环调用函数出错