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++多种图像处理基本算法源码