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

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

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

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.lryc.cn/news/117555.html

相关文章:

  • 轻量级Web框架Flask
  • 【gridsample】地平线如何支持gridsample算子
  • JPA实现存储实体类型信息
  • 阿里云快速部署开发环境 (Apache + Mysql8.0+Redis7.0.x)
  • 语音秘书:让录音转文字识别软件成为你的智能工作助手
  • 【腾讯云 Cloud Studio 实战训练营】用于编写、运行和调试代码的云 IDE泰裤辣
  • [C#] 简单的俄罗斯方块实现
  • postman官网下载安装登录详细教程
  • (贪心) 剑指 Offer 14- I. 剪绳子 ——【Leetcode每日一题】
  • 如何将Linux上的cpolar内网穿透设置成 - > 开机自启动
  • 50.两数之和(力扣)
  • k8s基础
  • 【自然语言处理】大模型高效微调:PEFT 使用案例
  • FFmpeg将编码后数据保存成mp4
  • 设置VsCode 将打开的多个文件分行(栏)排列,实现全部显示
  • Vue.js2+Cesium1.103.0 六、标绘与测量
  • 【redis 延时队列】使用go-redis的list做异步,生产消费者模式
  • 激光焊接塑料多点测试全画面穿透率测试仪
  • 用 Uno 当烧录器给 atmega328 烧录 bootloader
  • spring boot策略模式实用: 告警模块为例
  • Camunda 7.x 系列【10】使用 Rest API 运行流程实例
  • Python-OpenCV中的图像处理-边缘检测
  • 一文了解Java序列化和反序列化:对象的存储与传输
  • react-codemirror2 编辑器需点击一下或者延时才显示数据的问题
  • 火山引擎联合Forrester发布《中国云原生安全市场现状及趋势白皮书》,赋能企业构建云原生安全体系
  • 需要数电发票接口的,先熟悉下数电发票基本常识
  • node-sass是什么
  • C语言指针之 进阶
  • C++单例模式
  • C++ 析构函数