LIME低亮度图像增强

LIME低亮度图像增强

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main.cpp

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include "lime.h"

int main()
{

	cv::Mat img_in = cv::imread("3.png"), img_out;

    if (img_in.empty())
    {
        std::cout << "Error Input!" << std::endl;
        return -1;
    }

    feature::lime* l;
    l = new feature::lime(img_in);
    img_out = l->lime_enhance(img_in);
    cv::imshow("test", img_out);
    cv::waitKey();
	return 0;
}``![在这里插入图片描述](https://img-blog.csdnimg.cn/2809aa49d0a2413db92b974659ab6062.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/3f4f458bb0e6425bad8f5ae0cbca84f2.png)

```lime.cpp
#include "lime.h"

namespace feature
{
	lime::lime(cv::Mat src)
	{
		channel = src.channels();
	}

	cv::Mat lime::lime_enhance(cv::Mat& src)
	{
        cv::Mat img_norm;
        src.convertTo(img_norm, CV_32F, 1 / 255.0, 0);

        cv::Size sz(img_norm.size());
        cv::Mat out(sz, CV_32F, cv::Scalar::all(0.0));

        auto gammT = out.clone();

        if (channel == 3)
        {

            Illumination(img_norm, out);
            Illumination_filter(out, gammT);

            //lime
            std::vector<cv::Mat> img_norm_rgb;
            cv::Mat img_norm_b, img_norm_g, img_norm_r;

            cv::split(img_norm, img_norm_rgb);

            img_norm_g = img_norm_rgb.at(0);
            img_norm_b = img_norm_rgb.at(1);
            img_norm_r = img_norm_rgb.at(2);

            cv::Mat one = cv::Mat::ones(sz, CV_32F);

            float nameta = 0.9;
            auto g = 1 - ((one - img_norm_g) - (nameta * (one - gammT))) / gammT;
            auto b = 1 - ((one - img_norm_b) - (nameta * (one - gammT))) / gammT;
            auto r = 1 - ((one - img_norm_r) - (nameta * (one - gammT))) / gammT;

            cv::Mat g1, b1, r1;

            //TODO <=1
            threshold(g, g1, 0.0, 0.0, 3);
            threshold(b, b1, 0.0, 0.0, 3);
            threshold(r, r1, 0.0, 0.0, 3);

            img_norm_rgb.clear();
            img_norm_rgb.push_back(g1);
            img_norm_rgb.push_back(b1);
            img_norm_rgb.push_back(r1);

            cv::merge(img_norm_rgb, out_lime);
            out_lime.convertTo(out_lime, CV_8U, 255);

        }
        else if (channel == 1)
        {
            Illumination_filter(img_norm, gammT);
            cv::Mat one = cv::Mat::ones(sz, CV_32F);
            float nameta = 0.9;
            //std::cout<<img_norm.at<float>(1,1)<<std::endl;
            auto out = 1 - ((one - img_norm) - (nameta * (one - gammT))) / gammT;

            threshold(out, out_lime, 0.0, 0.0, 3);

            out_lime.convertTo(out_lime, CV_8UC1, 255);

        }

        else
        {
            std::cout << "There is a problem with the channels" << std::endl;
            exit(-1);
        }
        return out_lime.clone();
	}

	void lime::Illumination(cv::Mat& src, cv::Mat& out)
	{
		int row = src.rows, col = src.cols;

		for (int i = 0; i < row; i++)
		{
			for (int j = 0; j < col; j++)
			{
				out.at<float>(i, j) = lime::compare(src.at<cv::Vec3f>(i, j)[0],
					src.at<cv::Vec3f>(i, j)[1],
					src.at<cv::Vec3f>(i, j)[2]);
			}

		}
	}

	void lime::Illumination_filter(cv::Mat& img_in, cv::Mat& img_out)
	{
		int ksize = 5;
		//mean filter
		blur(img_in, img_out, cv::Size(ksize, ksize));
		//GaussianBlur(img_in,img_mean_filter,Size(ksize,ksize),0,0);

		//gamma
		int row = img_out.rows;
		int col = img_out.cols;
		float tem;
		float gamma = 0.8;
		for (int i = 0; i < row; i++)
		{

			for (int j = 0; j < col; j++)
			{
				tem = pow(img_out.at<float>(i, j), gamma);
				tem = tem <= 0 ? 0.0001 : tem;  //  double epsolon = 0.0001;
				tem = tem > 1 ? 1 : tem;

				img_out.at<float>(i, j) = tem;

			}
		}
	}


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Postman工具做接口测试 —— 环境变量与请求参数格式!

引言 在上一篇笔记我们主要介绍了接口测试的基础知识与基本功能&#xff0c;本章主要介绍如何使用postman做接口测试。 配置环境变量和全局变量 环境变量和全局变量 环境管理中还可以点击“Global”添加全局变量&#xff0c;环境变量只有当选择了该环境时才生效&#xff0c;…

电脑出现emp.dll文件缺失的错误提示怎么办,教你一键解决dll丢失问题

今天&#xff0c;我想和大家分享一下关于emp.dll文件丢失的4个解决方法&#xff0c;希望能对大家有所帮助。 首先&#xff0c;我们要明确emp.dll文件的作用。emp.dll是一个动态链接库文件&#xff0c;这个文件对于许多程序的正常运行至关重要&#xff0c;一旦丢失&#xff0c;…

pytorch笔记 GRUCELL

1 介绍 GRU的一个单元 2 基本使用方法 torch.nn.GRUCell(input_size, hidden_size, biasTrue, deviceNone, dtypeNone) 输入&#xff1a;&#xff08;batch&#xff0c;input_size&#xff09; 输出和隐藏层&#xff1a;&#xff08;batch&#xff0c;hidden_size&#xf…

正点原子嵌入式linux驱动开发——Linux 块设备驱动

经过之前这些笔记的学习&#xff0c;都是字符设备驱动&#xff0c;本章来学习一下块设备驱动框架&#xff0c;块设备驱动是Linux三大驱动类型之一。块设备驱动要远比字符设备驱动复杂得多&#xff0c;不同类型的存储设备又对应不同的驱动子系统&#xff0c;本章重点学习一下块设…

CSP-31补题日记--梯度求解

202309-3-梯度求解 题目链接 http://118.190.20.162/view.page?gpidT173 最近刚刚在上数据结构二叉树 跟这道题真的是强相关 然后在就是涉及到了数学求导 这基本上是我复学两个月做的最久的题了 感觉做完这道题对栈和二叉树理解比以前清晰了很多 不摆了 上代码 ** 题目思路&am…

STM32HAL-完全解耦面向对象思维的架构-时间轮片法使用(timeslice)

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、代码解释 六、总结 概述 timeslice是一个时间片轮询框架&#xff0c;完全解耦的时间片轮询框架&#xff0c;非常适合裸机单片机引用。接下来将该框架移植到stm32单片机运行&#xff0c;单片机…

Git命令大全

Git命令大全 1、初始化本地仓库 git init <directory><>意思是可选的&#xff0c;如果不指定&#xff0c;将使用当前目录。 2.克隆一个远程仓库 git clone <url>3.添加文件到暂存区 git add <file>要添加当前目录中的所有文件&#xff0c;请使用.…

Http代理与socks5代理有何区别?如何选择?(一)

了解SOCKS和HTTP代理之间的区别对于优化您的在线活动至关重要&#xff0c;无论您是技术娴熟的个人、现代互联网用户还是企业所有者。在使用代理IP时&#xff0c;您需要先了解这两种协议之间的不同。 一、了解HTTP代理 HTTP&#xff08;超文本传输协议&#xff09;代理专门设计…

C语言_动态内存管理

文章目录 一.为什么存在动态内存分配二.动态内存函数的介绍2.1 malloc 和 free2.2 calloc原型如下 2.3 realloc函数模型如下 三.常见的动态内存错误3.1 对NULL的解引用操作3.2对动态开辟空间的越界访问3.3非动态开辟内存使用free释放3.4使用free释放一块动态开辟内存的一部分3.…

数据结构(超详细讲解!!)第二十节 数组

1.定义 1.概念 相同类型的数据元素的集合。 记作&#xff1a;A(A0,A1,…,Am-1) 二维数组可看作是每个数据元素都是相同类型的一维数组的一维数组。多维数组依此类推。 二维数组是数据元素为线性表的线性表。 A(A0&#xff0c;A1&#xff0c;……&#xff0c;An-1) 其中…

JAVA 实现PDF转图片(spire.pdf.free版)

1.引入jar包 导入方法1&#xff1a; 手动引入。将Free Spire.PDF for Java下载到本地&#xff0c;解压&#xff0c;找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面&#xff0c;将本地路径中的jar文件引入Java程序&#xff1a; 导入方法2&#xff1a;如果您想通过…

uinapp微信小程序隐私政策授权

&#x1f680; 隐私弹窗效果图&#xff1a; 1、启用隐私相关功能在manifest.json文件中配置 usePrivacyCheck: true "mp-weixin" : {"__usePrivacyCheck__" : true, },2、创建组件 <template><view><!-- 隐私政策弹窗 --><uni-popu…

高德地图撒点组件

一、引入amap地图库 - public/index.html <script type"text/javascript">window._AMapSecurityConfig {securityJsCode: 地图密钥 }</script><scripttype"text/javascript"src"https://webapi.amap.com/maps?v1.4.8&key111111…

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

基于单片机的自动感应门设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、自动感应门设计的功能概述二、系统总体方案2.1系统的总体计划2.2元器件的介绍2.2.1单片机的…

【程序员日记】一行console.log引发的血案

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 艰难的排查过程1. 程序闪退2. 确定为内存泄漏3. 误入歧途4. 二分法注释代码5. 猿脑猜想 2️⃣ 排查procexp.exePerformance 和 Memory 3️⃣ 剔除生产环境中的console.logwebpack插件terser-webpack-plugin &#x1f6ec; 文章…

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的&#xff0c;不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能&#xff1a; https://github.com/handiko/Arduino-APRS 我要做的&#xff0c;就是简单修改一下代码&#xff0c;做一个转接板。 YEASU官方没有给出VX-3R的音…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网&#xff1a;电信网络、有线电视网络、计算机网络 概念&#xff1a;把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义&#xff1a;计算机网络是将地理位置不同的独立计算机系统&#xff0c;通过传输介质链接起来&#xff0c…

7-4 修理牧场 分数 15

#include<iostream> #include<queue> using namespace std; #define maxn 10005int main() {int n 0, data 0;cin >> n;//建小堆: //上调建堆中用greater: 父大子小 父子交换 小的上去 大的下去 priority_queue<int, vector<int>, greater<int…

vue+asp.net Web api前后端分离项目发布部署

一、前后端项目介绍 1.前端项目是使用vue脚手架进行创建的。 脚手架版本&#xff1a;vue/cli 5.0.8 编译器版本&#xff1a;vs code 1.82.2 2.后端是一个asp.net Core Web API 项目 后端框架版本&#xff1a;.NET 6.0 编译器版本&#xff1a;vs 2022 二、发布部署步骤 第…
最新文章