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

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

{
    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](https://private.codecogs.com/gif.latex?y%3Dcx%5E%7Br%7D&plus;b),其中c和r都是为正数,当r=1的时候幂次变换变成线性变换,由于图像的像素值范围在0-255之间,所以一般公式会变换成:![y=255c(\frac{x}{255})^{r}+b](https://private.codecogs.com/gif.latex?y%3D255c%28%5Cfrac%7Bx%7D%7B255%7D%29%5E%7Br%7D&plus;b),当r<1的时候,变换函数曲线在正比函数上方,此时扩展低灰度级,压缩高灰度级,使图像变亮;当r>1的时候,变换函数曲线在正比函数下方,此时扩展高灰度级,压缩低灰度级,使图像变暗。其取值对函数曲线的影响见下图:


![](https://img-blog.csdnimg.cn/20190827211759700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMyODkyNTQ=,size_16,color_FFFFFF,t_70)


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


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


**此代码中“origiin”一般为灰度图片,彩色图片转灰度图片,可参考我的一篇博客:**[彩色图转灰度图之c++实现(qt + 不调包)\_天竺街潜水的八角的博客-CSDN博客](https://bbs.csdn.net/topics/618668825)



/幂次变化函数/
/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](https://private.codecogs.com/gif.latex?y%3Db%5E%7B_%7Bc%28x-a%29%7D%7D-1),其中,参数b、c控制曲线形状,参数a控制曲线的左右位置。指数变换的曲线可见下图:


![](https://img-blog.csdnimg.cn/20190827212617293.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMyODkyNTQ=,size_16,color_FFFFFF,t_70)


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


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


**此代码中“origiin”一般为灰度图片,彩色图片转灰度图片,可参考我的一篇博客:**[彩色图转灰度图之c++实现(qt + 不调包)\_天竺街潜水的八角的博客-CSDN博客](https://bbs.csdn.net/topics/618668825)



/指数变化函数/
/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;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值