灰度非线性变换之c++实现(qt + 不调包)

news2024/9/20 14:58:45

    本章介绍灰度非线性变换,具体内容包括:对数变换、幂次变换、指数变换。他们的共同特点是使用非线性变换关系式进行图像变换。

1.灰度对数变换

    变换公式:y = a + log(1+x) / b,其中,a控制曲线的垂直移量;b为正常数,控制曲线的弯曲程度。其取值对函数曲线的影响见下图:

    对数变换实现了图像灰度扩展和压缩的功能,它扩展低灰度值而压缩高灰度值,让图像的灰度分布更加符合人的视觉特征。

    代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解

    此代码中“origiin”一般为灰度图片,彩色图片转灰度图片,可参考我的一篇博客:彩色图转灰度图之c++实现(qt + 不调包)

/*对数变化函数*/
/*a1为控制参数,表示曲线的上下偏移量   b1为控制参数,表示曲线的弯曲程度*/
QImage* MainWindow::LogTrans(QImage* origiin,float a1, float b1)
{
    QImage* newImage = new QImage(origiin->width(), origiin->height(), QImage::Format_ARGB32);

    QColor oldColor;
    int r, g, b;
    for(int y = 0; y < newImage->height(); y++)
    {
        for(int x = 0; x < newImage->width(); x++)
        {
            oldColor = QColor(origiin->pixel(x,y));
            r = (log(oldColor.red() + 1.0))/b1+ a1;
            g = (log(oldColor.green() + 1.0))/b1+ a1;
            b = (log(oldColor.blue() + 1.0))/b1+ a1;
            r = qBound(0, r, 255);
            g = qBound(0, g, 255);
            b = qBound(0, b, 255);
            newImage->setPixel(x, y, qRgb(r, g, b));
        }
    }
    return newImage;
}

2.灰度幂次变换

    变换公式:y=cx^{r}+b,其中c和r都是为正数,当r=1的时候幂次变换变成线性变换,由于图像的像素值范围在0-255之间,所以一般公式会变换成:y=255c(\frac{x}{255})^{r}+b,当r<1的时候,变换函数曲线在正比函数上方,此时扩展低灰度级,压缩高灰度级,使图像变亮;当r>1的时候,变换函数曲线在正比函数下方,此时扩展高灰度级,压缩低灰度级,使图像变暗。其取值对函数曲线的影响见下图:

    灰度幂次变换一般用于显示设备的伽马校正中。

    代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解

    此代码中“origiin”一般为灰度图片,彩色图片转灰度图片,可参考我的一篇博客:彩色图转灰度图之c++实现(qt + 不调包)

/*幂次变化函数*/
/*b1为控制参数,表示曲线的上下偏移量  c1为控制参数,表示曲线的弯曲程度  r1为控制参数,表示函数的幂次*/
QImage* MainWindow::PowerTrans(QImage* origiin,float b1, float c1, float r1)
{
    QImage* newImage = new QImage(origiin->width(), origiin->height(), QImage::Format_ARGB32);

    QColor oldColor;
    int r, g, b;
    for(int y = 0; y < newImage->height(); y++)
    {
        for(int x = 0; x < newImage->width(); x++)
        {
            oldColor = QColor(origiin->pixel(x,y));
            r = c1 * pow(oldColor.red() /255.0, r1) * 255 + b1;
            g = c1 * pow(oldColor.green() /255.0, r1) * 255 + b1;
            b = c1* pow(oldColor.blue() /255.0, r1) * 255 + b1;
            r = qBound(0, r, 255);
            g = qBound(0, g, 255);
            b = qBound(0, b, 255);
            newImage->setPixel(x, y, qRgb(r, g, b));
        }
    }
    return newImage;
}

3.灰度指数变换

    变换公式:y=b^{_{c(x-a)}}-1,其中,参数b、c控制曲线形状,参数a控制曲线的左右位置。指数变换的曲线可见下图:

    指数变换的作用是扩展图像的高灰度级,压缩低灰度级。虽然幂次变换也有这个功能,但是图像经过指数变换后对比度更高,高灰度级也被扩展到了更宽的范围。

    代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解

    此代码中“origiin”一般为灰度图片,彩色图片转灰度图片,可参考我的一篇博客:彩色图转灰度图之c++实现(qt + 不调包)

/*指数变化函数*/
/*a1为控制参数,表示曲线的左右偏移量  b,c为控制参赛,表示曲线的弯曲程度*/
QImage* MainWindow::ExpTrans(QImage* origiin,float a1, float b1, float c1)
{
    QImage* newImage = new QImage(origiin->width(), origiin->height(), QImage::Format_ARGB32);

    QColor oldColor;
    int r, g, b;
    for(int y = 0; y < newImage->height(); y++)
    {
        for(int x = 0; x < newImage->width(); x++)
        {
            oldColor = QColor(origiin->pixel(x,y));
            r = pow(b1, c1*(oldColor.red()-a1) ) - 1;
            g =  pow(b1, c1*(oldColor.green()-a1))  - 1;
            b = pow(b1, c1*(oldColor.blue() -a1))  - 1;
            r = qBound(0, r, 255);
            g = qBound(0, g, 255);
            b = qBound(0, b, 255);
            newImage->setPixel(x, y, qRgb(r, g, b));
        }
    }
    return newImage;
}

4.参考资料

    数字图像处理——技术详解与Visual C++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去

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

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

相关文章

有哪些免费的mac虚拟机软件?

在当今数字化时代&#xff0c;虚拟机系统成为许多用户在电脑上同时运行多个操作系统的理想选择。虚拟机系统不仅能够提供隔离环境&#xff0c;还可以帮助用户在单一设备上使用多个操作系统和应用程序。然而&#xff0c;有些用户可能会面临安装软件和提高虚拟机性能的挑战。下面…

设计方法编写测试用例---思路分析

测一四年我在YX公司带测试团队&#xff0c;一个用例评审的会议上&#xff0c;一不小心超常发挥&#xff0c;结果卡在了一个用例设计方法上&#xff0c;印象非常深刻&#xff0c;当时的业务场景是支付方式的选择和优惠方案。 在后来的工作中&#xff0c;也曾几次遇到需要选择合…

Games101学习笔记 -光栅化

光栅化 经过MVP矩阵和视口变换后&#xff0c;我们就可以从相机的角度看到一个和屏幕大小一致的二维平面。 那么把这个看到的二维平面应用到我们的屏幕上的过程就是光栅化。在这儿我们需要补充一个概念-像素&#xff1a; 像素&#xff1a; 一个二位数组&#xff0c;数组中每个…

Games101学习笔记 - MVP矩阵

MV矩阵&#xff08;模型视图变换&#xff09; 目的&#xff0c;把摄像机通过变换移动的世界坐标远点&#xff0c;并且朝向与Z轴的负方向相同。这个变换就是模型试图变换。 因为移动了相机&#xff0c;如果想保持正确的渲染的话&#xff0c;那么对应的物体需要要和相机保持相对…

【问题解决:在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-遗留问题-开机自启动can】

【问题解决在英伟达nvidia的jetson-orin-nx上使用调试can基础收发-遗留问题-开机自启动can】 1、概述2、实验环境3、问题描述# 1-1、发送可以发送&#xff0c;但是PC发送数据收不到。# 1-2、接收是可以接收&#xff0c;但是发送PC收不到数据 4、解决方式&#xff08;1&#xff…

常用的负载均衡算法(NGINX篇)

负载均衡算法用于在多个服务器或资源之间分配工作负载&#xff0c;以优化资源利用率、降低延迟、提高吞吐量并确保系统的容错性。 这里介绍并实验4种负载均衡算法&#xff08;随机的方法理论上也算&#xff0c;但一般不会这么搞&#xff09;&#xff0c;在NGINX上。 目录 轮询…

Vue 插槽 slot

solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。 2.6.0 版本以下的 slot 插槽在&#xff0c;2.x版本将继续支持&#xff0c;但是在 Vue 3 中已被废弃&#xff0c;且不会出现在官方文档中。 作用 插槽 prop 允许我们将插槽转换为可复用的模板&#xff0c;这些模板可以基于…

【第一阶段】kotlin的函数

函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范&#xff0c;先有输入&#xff08; getMethod(name:String,age:Int)&#xff09;再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

拓扑序练习(一)

题目 LintCode127 给定一个有向图&#xff0c;图节点的拓扑排序定义如下: 对于图中的每一条有向边 A -> B , 在拓扑排序中A一定在B之前. 拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点。 如下图所示&#xff1a; 拓扑排序可以为: [0, 1, 2, 3, 4,…

排序八卦炉之总复习【改良版】

文章目录 1.总结2.总代码2.1Stack.h2.2Stack.c2.3Sort.h2.4Sort.c2.5Test.c 1.总结 2.总代码 点击 排序&#xff08;C&#xff09; 跳转码云获取完整代码 2.1Stack.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include …

以http_proxy和ajp_proxy方式整合apache和tomcat(动静分离)

注意&#xff1a;http_proxy和ajp_proxy的稳定性不如mod_jk 一.http_proxy方式 1.下载mod_proxy_html.x86_64 2.在apache下创建http_proxy.conf文件&#xff08;或者直接写到conf/httpd.conf文件最后&#xff09; 3.查看server.xml文件 到tomcat的安装目录下的conf/serve…

Python-OpenCV中的图像处理-图像阀值

Python-OpenCV中的图像处理-图像阀值 图像阈值单阈值自适应阈值Otsus二值化 图像阈值 单阈值 与名字一样&#xff0c;这种方法非常简单。但像素值高于阈值时&#xff0c;我们给这个像素赋予一个新值&#xff08;可能是白色&#xff09;&#xff0c;否则我们给它赋予另外一种颜…

数据结构--BFS求最短路

数据结构–BFS求最短路 BFS求⽆权图的单源最短路径 注&#xff1a;⽆权图可以视为⼀种特殊的带权图&#xff0c;只是每条边的权值都为1 以 2 为 b e g i n 位置 以2为begin位置 以2为begin位置 代码实现 //求顶点u到其他顶点的最短路径 void BFS_MIN_Distance(Graph G, int u…

开发工具Eclipse的使用之导入项目(import)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 一.导读 上篇我们已经详细介绍了开发工具eclipse&#xff0c;也说明了eclipse的基本使用&#xff0c;那么我们这篇来详细讲述一下怎…

yolov5目标检测多线程C++部署

C多线程复习 下面的代码搭建了简单的一个生产者-消费者模型&#xff0c;在capture()函数中进行入队操作&#xff0c;infer()函数中进行出队操作&#xff0c;为了模拟采图-推理流程&#xff0c;在函数中调用Sleep()函数延时。 #include <iostream> #include <string&…

Unity游戏源码分享-儿童益智数学大脑训练游戏

Unity游戏源码分享-儿童益智数学大脑训练游戏 5秒内选择答案 项目下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88198773

数据结构:双向链表的实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言 一、实现思路1.节点的结构(ListNode)2.新节点的创建(BuyListNode)3.头结点的创建(ListCreate)4.双向链表的销毁(ListDestroy)5.双向链表的打印(ListPrint)6.双向链表的尾插(ListPu…

Vue3项目中使用原生input实现excel导入导出功能

重写input样式 首先我们先来重写input的原生样式&#xff0c;毕竟实在不好看。这里的思路很简单input外面套一层div然后让input撑满盒子然后给input隐藏了就行 <div class"bg-[#f8f8f8] w-[430px] h-[220px] rounded-md cursor-pointer relative outline-0">…

Git详解及使用

Git简介 Git 是一种分布式版本控制系统&#xff0c;它可以不受网络连接的限制&#xff0c;加上其它众多优点&#xff0c;目前已经成为程序开发人员做项目版本管理时的首选&#xff0c;非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…

计算机组成原理-笔记-第四章

目录 第四章——指令系统 1、指令格式 &#xff08;1&#xff09;指令&#xff08;机器指令-二进制数&#xff09; &#xff08;2&#xff09;指令分类&#xff08;按照 地址码的数量 分类&#xff09; &#xff08;3&#xff09;指令分类&#xff08;按照长度分类&#x…