灰度拉伸变换之c++实现(qt + 不调包)

1.基本原理

    灰度拉伸,与线性变换有点类似(可参考:灰度线性变换之c++实现(qt + 不调包)_天竺街潜水的八角的博客-CSDN博客),不同之处在于灰度拉伸使用的是分段线性变换,所以它最大的优势是变换函数可以由用户任意合成。其公式如下图,其中x为输入像素值,y为输出像素值,x1、x2、y1和y2都是参数。

    1)当(y2-y1)/ (x2-x1)>1的时候,可以增强图像的对比度

    2)当(y2-y1)/ (x2-x1)<1的时候,可以降低图像的对比度

    3)当(y2-y1)/ (x2-x1)=1的时候,为线性变化函数

    4)当x2=x1,y1=0,y2=255的时候,为阈值函数

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

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

QImage* MainWindow::GrayStretch(QImage* origiin,float x1, float y1, float x2, float y2)
{
    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));
           if (oldColor.red() < x1)
           {
              if(fabs(x1 - 0) > 0.0001)
                  r = (float)y1 / (float)x1 * oldColor.red();
              else
                  r =0;
           }
           else if (oldColor.red() <= x2)
           {
              if(fabs(x2 - x1) > 0.0001)
                  r = (float) (y2 - y1) / (float) (x2 - x1) * (oldColor.red() - x1) + y1;
              else
                  r = oldColor.red();
           }
           else
           {
               if(fabs(y2 - 255) > 0.0001)
                   r = (float) (255 - y2) / (float) (255 - x2) * (oldColor.red() - x2) + y2;
               else
                   r = 255;
           }
            g = b = r;
            newImage->setPixel(x, y, qRgb(r, g, b));
        }
    }
    return newImage;
}

3.下载路径

   整个系列链接: https://blog.csdn.net/m0_59023219/category_12425183.html

   内容介绍:

  [1]根据算法原理,编写纯c++源码,不调用外源库opencv 等;
  [2]包括各种图像处理的基本算法,包含腐蚀膨胀,缩放,转置,镜像,平移,均衡变化,灰度拉升,灰度阈值,灰度非线性,转灰度,灰度线性,旋转,简单平滑,高斯平滑,轮廓跟踪,种子算法,hough直线检测,拉普拉斯,带方向边缘检测,常规边缘检测(梯度算子、Roberts算子和Sobel算子),中值滤波,反色操作等;
  [3]程序中有完整的注释,便于大家很好理解代码。

   代码下载路径:基于QT的C++多种图像处理基本算法源码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值