C#,保持亮度的动态直方图均衡化(Brightness Preserving Dynamic Histogram Equalization:BPDHE)源代码

news2024/11/15 16:55:37

 

图像增强的主要目的是显示隐藏的图像细节,或者用新的动态范围增加图像对比度。直方图均衡(HE)是用于图像对比度增强的最流行的技术之一,因为HE在计算上快速且易于实现。HE通过基于输入灰度级的概率分布重新映射图像的灰度级来执行其操作。然而,HE很少用于视频监控、数码相机和电视等消费电子应用,因为HE往往会引入一些令人讨厌的伪影和不自然的增强,包括强度饱和效应。这个问题的原因之一是HE通常会显著改变图像的亮度,从而使输出图像变得饱和,具有非常亮或暗的强度值。因此,为了增强消费电子产品的图像,亮度保持是需要考虑的一个重要特性。

为了克服HE的局限性并保持图像的亮度,人们提出了几种保持亮度的直方图均衡技术。首先,Kim提出了保持亮度的双直方图均衡(BBHE),BBHE根据输入图像的平均值将输入图像直方图分为两部分,然后独立地对每个部分进行均衡。因此,由于保留了原始平均亮度,所以保留了平均亮度。Wan等人引入了二元子图像直方图均衡(DSIHE),它类似于BBHE,只是输入图像的中值用于直方图分割,而不是平均亮度[5]。Chen和Ramli提出了最小平均亮度误差双直方图均衡(MMBEBHE),这是BBHE方法的扩展,提供了最大的亮度保持。该算法找出原始图像和增强图像之间的最小平均亮度误差。它采用最优点作为分离点,而不是输入图像的平均值或中值。尽管这些方法可以执行良好的对比度增强,但根据直方图中灰度分布的变化,它们也会导致更令人讨厌的副作用。递归平均分离HE(RMSHE)是BBHE的另一个改进版本。该方法递归地将直方图分离为多个子直方图,而不是像BBHE中那样将两个子直方图分离。最初,根据原始直方图的平均亮度创建两个子直方图。随后,来自先前获得的两个子直方图的平均亮度被用作创建更多子直方图的第二和第三分离点。以类似的方式,递归地执行该算法,直到满足所需数量的子直方图。然后,HE方法独立地应用于每个子直方图。前面讨论的方法是基于通过使用中值或平均亮度将原始直方图划分为几个子直方图。尽管上述方法很好地保持了平均亮度,但这些方法不能进一步扩展位于动态范围的最小值或最大值附近的亚直方图区域。然而,它也并非没有副作用,例如褪色的外观、不希望的棋盘效果和图像亮度的显著变化。

为了解决上述问题,Abdullah Al-Wadud等人引入了动态直方图均衡(DHE)技术。DHE基于局部极小值对原始直方图进行分割。然而,DHE并不考虑亮度的保持。为此,Ibrahim和Kong提出了保持亮度的动态直方图均衡(BPDHE)。该方法基于平滑直方图的局部最大值来分割图像直方图。它为每个分区分配一个新的动态范围。最后,对输出强度进行归一化,使所得图像的平均强度等于输入强度。尽管BPHE在平均亮度保持方面表现良好,但亮度归一化的比率起着重要作用。较小的比值会导致不显著的对比度增强。对于大比率(即比率值大于1),最终强度值可能超过输出动态范围的最大强度值。超出的像素将被量化为灰度级的最大强度值,并产生强度饱和问题(在MATLAB环境中)。Sheet等人提出了保持亮度的动态模糊直方图均衡(BPDFHE)。这是BPDFHE的增强版本。BPDFHE技术以这样的方式操纵图像直方图,即不发生直方图峰值的重新映射,而只发生两个连续峰值之间的谷部分中的灰度值的重新分布。使用BPDFHE方法的结果显示出良好的对比度增强和小的伪影。

为了克服不必要的过度增强和噪声放大,提出了基于模糊逻辑的灰度和彩色图像直方图均衡技术。所提出的FHE方法不仅保持了图像的亮度,而且提高了原始图像的局部对比度。首先,利用模糊集理论计算模糊直方图。其次,根据原始图像的中值将模糊直方图一分为二。最后,HE方法被独立地应用于每个子直方图以提高对比度。

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legal.Truffer.ImageProcess

{

public partial static class CVUtility
{

    /// <summary>
    /// 直方图均衡化
    /// 保持亮度的动态直方图均衡化(Brightness Preserving Dynamic Histogram Equalization:BPDHE)
    /// </summary>
    /// <param name="src"></param>
    /// <returns></returns>
    public static Mat Equalization_BPDHE(Mat src)
    {
        double[] B = new double[256];
        for (int k = 0; k < 255; k++)
        {
            int t1 = 0, t2 = 0, t3 = 0;
            for (int m = 0; m < src.Rows; m++)
            {
                for (int n = 0; n < src.Cols; n++)
                {
                    if (src.At<Vec3b>(m, n)[0] == k) t1 = t1 + 1;
                    if (src.At<Vec3b>(m, n)[1] == k) t2 = t2 + 1;
                    if (src.At<Vec3b>(m, n)[2] == k) t3 = t3 + 1;
                }
            }

            int t = t1 + t2 + t3;
            double b = 1.0f / (src.Rows * src.Cols * 3.0);
            double x = t * b;
            B[k] = x;
        }

        double[] T1 = new double[256];
        for (int i = 1; i < 256; i++)
        {
            for (int j = 1; j < i; j++)
            {
                T1[i - 1] = B[j - 1] + T1[i - 1];
            }
        }

        double[] T2 = new double[256];
        for (int i = 1; i < 256; i++)
        {
            T2[i - 1] = Math.Round((T1[i - 1] * 255) + 0.5);
        }

        Mat bpdhe = new Mat();
        src.CopyTo(bpdhe);
        for (int i = 0; i < 255; i++)
        {
            for (int j = 0; j < src.Rows; j++)
            {
                for (int k = 0; k < src.Cols; k++)
                {
                    if (bpdhe.At<Vec3b>(j, k)[0] == i)
                        bpdhe.At<Vec3b>(j, k)[0] = (byte)T2[i];
                    if (bpdhe.At<Vec3b>(j, k)[1] == i)
                        bpdhe.At<Vec3b>(j, k)[1] = (byte)T2[i];
                    if (bpdhe.At<Vec3b>(j, k)[2] == i)
                        bpdhe.At<Vec3b>(j, k)[2] = (byte)T2[i];
                }
            }
        }

        return bpdhe;
    }
}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生使用的台灯该怎么选择?学生台灯应该这样选

随着时代快速发展&#xff0c;目前我国近视人数达到了7亿&#xff0c;呈现低龄化趋势&#xff0c;儿童及青少年人数占了53.8%。而且现在的学生学业负担都很重&#xff0c;每个家长都不希望自己的孩子近视或加深近视了&#xff0c;都会想尽一切办法保护视力。而护眼台灯就成了家…

光伏储能电能管理系统解决方案蓄电池管理

概述 在我国新型电力系统中&#xff0c;新能源装机容量逐年提高&#xff0c;但是新能源比如光伏发电、风力发电是不稳定的能源&#xff0c;所以要维持电网稳定&#xff0c;促进新能源发电的消纳&#xff0c;储能将成为至关重要的一环&#xff0c;是分布式光伏、风电等新能源消…

怎么用ai作图?简单几步教会你ai绘画

当我和我的朋友们闲聊的时候&#xff0c;一个话题引起了我们的兴趣——更新社交媒体头像。其中有一个朋友提出&#xff0c;想要制作一个与真人无异、美观大方的头像&#xff0c;但是却不知道该如何下手。于是乎&#xff0c;我们开始讨论ai绘画头像软件。大家都纷纷表示听说过&a…

基于Java+SpringBoot+vue的实验室管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

cubemx hal stm32 atgm336h GPS 北斗 定位 模块 驱动代码

代码部分 atgm336h.c #include "atgm336h.h" #include "stdio.h" #include "string.h"char rxdatabufer; u16 point1 0;_SaveData Save_Data; LatitudeAndLongitude_s g_LatAndLongData {.E_W 0,.N_S 0,.latitude 0.0,.longitude 0.0 };…

Docker网络架构三剑客CNM,Libnetwork和Driver

Docker网络架构主要由三部分组成&#xff1a;CNM&#xff0c;Libnetwork和Driver。 1.CNM CNM&#xff08;Container Network Model&#xff09;是一种网络模型&#xff0c;用于定义容器的网络架构和实现容器之间的通信。 这其中也有三要素&#xff1a; 沙盒&#xff1a;Sand…

基于matlab使用无限阵列分析对大型阵列中的互耦进行建模(附源码)

一、前言 此示例使用无限数组分析对大型有限数组进行建模。晶胞上的无限阵列分析揭示了特定频率下的扫描阻抗行为。此信息与隔离元件图案和阻抗的知识一起使用&#xff0c;以计算扫描元件图案。然后&#xff0c;使用数组中的每个元素都具有相同扫描元素模式的假设对大型有限数组…

造纸工厂配电室环境监控系统的应用案例与硬件选型

摘要&#xff1a;智能配电室环境监控系统可实现自动巡检、自动预警等功能&#xff0c;减少人员到现场巡视次数&#xff0c;能及早发现设备的潜在风险&#xff0c;迅速检测故障&#xff0c;节约维护保养时长&#xff0c;为配电生产检修、运行、各业务的标准化、规范化管理提供有…

1:即使设计-ui:尺寸和单位

一&#xff1a; 1: 一倍尺寸 378*812 2:二倍尺寸 750*1624 3:三倍尺寸 1125*2436 二&#xff1a;PX和PT px&#xff1a;物理像素 pt&#xff1a;逻辑像素 pt只存在一倍图中 在一倍图&#xff0c;ptpx&#xff0c;二倍图 1px2pt 三&#xff1a;DP和SP

AI开源路在何方丨2023智源大会精彩回顾

导读 当下&#xff0c;AI开源已经成为了人类开源创新的主战场&#xff0c;是超大规模人类智力协同的最佳组织形式。得益于开源协作持续不断地推进&#xff0c;AI在这个时代飞速发展。可以说如果没有开源社区建设&#xff0c;就不会有今天人工智能的成就。 在2023智源大会AI开源…

【python】基于multiprocessing.Pool实现python并行化的坑和解决方案

坑1&#xff1a;apply_async调用的子函数不执行或执行不彻底的解决方案 解决&#xff1a;使用apply_async时传入error_callback检查报错 from multiprocessing import Pooldef processFolder(idx, folders, o_dir):train_mesh TrainMeshes(folders)output_path os.path.join…

python小游戏——骰子猜大小

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 我们已经基本学完了&#xff0c;逻辑判断和循环的用法&#…

Maven历史版本的下载

Maven历史版本的下载 打开Maven官网https://maven.apache.org/ 点击Download 点击Maven 3 archives

持续优化 XView 性能,大促弹窗搭投实践 | 京东云技术团队

背景 618 大促来了&#xff0c;对于业务团队来说&#xff0c;最重要的事情莫过于各种大促营销。如会场、直播带货、频道内营销等等。而弹窗作为一个极其重要的强触达营销工具&#xff0c;通常用来渲染大促氛围、引流主会场、以及通过频道活动来提升频道复访等。因此&#xff0…

Apache JMeter配置步骤压力测试实例

一. 安装环境&#xff1a;................................................................................................................ 2 二&#xff0e;安装步骤&#xff1a;...................................................................................…

QGis出图

工程——新建打印布局。 水平垂直参考线的妙用&#xff0c;很好用。 【【QGIS出图教程】免费软件&#xff01;地理科研论文制图&#xff0c;出研究区位图&#xff0c;比Arcgis出图好使】

快速入门SringCloud

认识微服务 微服务是一种经过良好架构设计的分布式架构方案&#xff0c;微服务的特征有&#xff1a; 单一职责&#xff1a;微服务拆分粒度小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复开发面向服务&#xff1a;微服务对外暴露…

linux 资源包安装详细教程

linux 资源包安装详细教程 一、离线下载安装1.1 下载1.2 安装1.3 错误&#xff1a;依赖检测失败 - 解决方案1.4 查看安装的包情况 二、在线安装 一、离线下载安装 1.1 下载 点击进入网页&#xff1a;linux资源包下载链接&#xff1a;pkgs.org在搜索栏输入需要的包&#xff0c…

d3dcompiler_47.dll丢失怎么解决(解决方案)

d3dcompiler_47.dll在Windows操作系统和 DirectX应用程序中使用此 DLL 文件,包括游戏&#xff0c;图形处理软件&#xff0c;CAD软件和其他3D应用程序中。如果电脑提示“由于找不到d3dcompiler_47.dll&#xff0c;无法继续执行此代码”&#xff0c;“d3dcompiler_47.dll缺失”&a…

C#多语言切换

第一步建立工程 第二步&#xff1a;拖拽控件 第三步选择窗体 第四步修改窗体localizable 属性为 true 如下图 第五步 修改language 属性 如下图 第六步&#xff1a;修改各个控件的字符名称 会出现下面的资源文件&#xff08;注意之前是没有资源文件的&#xff09; 第七步&…