opencv像素增强

术语解释

亮度(Brightness)

也叫亮度,中文翻译不同而已,你可以看Wikipedia
在 RGB 色彩空间中,明度可以被认为是R(红色),G(绿色)和B(蓝色)座标的算术平均 μ(尽管这三个成分中的某个要比其他看起来更明亮,但这可以被某些显示系统自动补偿):

 \mu = {R + G + B \over 3 }

对比度(Contrast)

我实在google不到满意的解释
大概上来说
灰度图像的对比度指的是图像中的最黑与最白的点,他们灰度值的比值关系
彩色图像由于有3种通道,我的理解是各个通道中的灰度值的比值关系,确切的定义还望有人指教

实现思路

知道明度跟对比度的定义,接下来
要修改亮度,就把图像的通道的灰度值一起增加或者减少就可以
要修改对比度,需要把图像的通道的灰度值以一个值为临界点,往相反两个方向变化
比如,取128为阈值,要增强对比度,低于128的值修改得比原来更小,高于128的值再修改得更大,要降低对比度就反向操作

下面给出我自己写的一份代码,演示明度以及对比度的调整
对比度的公式参考自Photoshop的公式:
nRGB = RGB + (RGB – Threshold) * Contrast / 255

源代码
#include "highgui.h"
#pragma comment(lib,"cv200d.lib")
#pragma comment(lib,"cxcore200d.lib")
#pragma comment(lib,"highgui200d.lib")
 
int BrightnessAdjust( const IplImage* srcImg,
                      IplImage* dstImg,
                      float brightness)
{
     assert (srcImg != NULL);
     assert (dstImg != NULL);
 
     int x,y,i;
     float val;
     for (i = 0; i < 3; i++) //彩色图像需要处理3个通道,灰度图像这里可以删掉
     {
         for (y = 0; y < srcImg->height; y++)
         {
             for (x = 0; x < srcImg->width; x++)
             {
 
                 val = ((uchar*)(srcImg->imageData + srcImg->widthStep*y))[x*3+i];
                 val += brightness;
                 //对灰度值的可能溢出进行处理
                 if (val>255)    val=255;
                 if (val<0) val=0;
                 ((uchar*)(dstImg->imageData + dstImg->widthStep*y))[x*3+i] = (uchar)val;
             }
         }
     }
 
     return 0;
}
 
int ContrastAdjust( const IplImage* srcImg,
                    IplImage* dstImg,
                    float nPercent)
{
     assert (srcImg != NULL);
     assert (dstImg != NULL);
 
     int x,y,i;
     float val;
     for (i = 0; i < 3; i++) //彩色图像需要处理3个通道,灰度图像这里可以删掉
     {
         for (y = 0; y < srcImg->height; y++)
         {
             for (x = 0; x < srcImg->width; x++)
             {
 
                 val = ((uchar*)(srcImg->imageData + srcImg->widthStep*y))[x*3+i];
                 val = 128 + (val - 128) * nPercent;
                 //对灰度值的可能溢出进行处理
                 if (val>255) val=255;
                 if (val<0) val=0;
                 ((uchar*)(dstImg->imageData + dstImg->widthStep*y))[x*3+i] = (uchar)val;
             }
         }
     }
     return 0;
}
 
int main( int argc, char ** argv)
{
     IplImage* srcImg = cvLoadImage( "lena.jpg" );
     assert ( srcImg != NULL );
 
     IplImage* brightnessImg = cvCloneImage(srcImg);
     //亮度变换,最后数值取值为正时变亮,负则变暗
     BrightnessAdjust(srcImg, brightnessImg, 80.0f);
 
     IplImage* contrastImg = cvCloneImage(srcImg);
     //对比度变换,数值小于1降低对比度,大于1增强对比度
     ContrastAdjust(srcImg, contrastImg, 1.3f);
 
     cvNamedWindow( "Source" ,CV_WINDOW_AUTOSIZE);
     cvNamedWindow( "BrightnessAdjust" ,CV_WINDOW_AUTOSIZE);
     cvNamedWindow( "ContrastAdjust" ,CV_WINDOW_AUTOSIZE);
     cvShowImage( "Source" ,srcImg);
     cvShowImage( "BrightnessAdjust" ,brightnessImg);
     cvShowImage( "ContrastAdjust" ,contrastImg);
     cvWaitKey(0);
     cvReleaseImage(&srcImg);
     cvReleaseImage(&brightnessImg);
     cvReleaseImage(&contrastImg);
     cvDestroyWindow( "Source" );
     cvDestroyWindow( "BrightnessAdjust" );
     cvDestroyWindow( "ContrastAdjustrast" );
 
     return 0;


对新手提示几句,运行这个代码请在工程文件的目录下放一个图片,名字是lena.jpg

另外,对彩色通道的处理,循环只有3次,这种循环最好放在最外围,因为图像的长宽一般都远大于这个值
如果你把小循环放最里面,频繁的循环切换,效率会低不少
这只是程序编写技巧上的小提示

本代码在Visual Studio 2008+OpenCV 2.0下运行通过,效果如下


并且与photoshop的调整效果对比过
亮度变换与ps旧版效果一致,貌似ps对亮度变换的公式进行过调整,新版不是这么单纯的加减灰度值
对比度就几乎都差不多了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
像素重构是使用OpenCV进行图像处理的一个技术,它将图像分成一组更小的区域,称为超像素。每个超像素代表了图像中的一个相似区域,其中的像素具有相似的颜色、纹理或其他特征。 超像素重构的目的是将图像分割成更易处理的块,以便于后续的图像分析和处理。在图像分割领域,超像素重构有着广泛的应用,如图像分割、目标检测和图像增强等。 OpenCV提供了一些用于超像素重构的图像处理函数和算法。其中最常用的是基于图像分割的超像素分割算法,如SLIC(Simple Linear Iterative Clustering)算法。该算法通过将图像像素分配到不同的簇中,来生成超像素OpenCV提供了用于实现SLIC算法的函数,可以通过调整其超参数,如聚类数目和距离度量,来控制生成的超像素的数量和质量。 除了基于图像分割的算法,OpenCV还提供了其他一些超像素重构算法,如LSC(Least Squares Conformal Auto-Context)算法和ERS(Entropy Rate Superpixel)算法等。这些算法通过不同的方式对图像进行分割和重构,可以根据具体需求选择适合的算法进行处理。 总之,超像素重构是OpenCV图像处理中的一个重要技术,它可以将图像分割成更小的区域,有助于后续的图像分析和处理。在实际应用中,可以根据具体需求选择合适的超像素重构算法,并通过调整算法的超参数来得到满足要求的超像素分割结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值