精华内容
下载资源
问答
  • 灰度拉伸

    2010-12-03 21:44:00
    7、灰度拉伸     功能与效果: 灰度拉伸和灰度的线性变换有点类似,都用到灰度的线性变换,但不同之处在于灰度拉伸不是完全的线性变换,而是分段进行线性变换。 <br />灰度拉伸...

    7、灰度拉伸

     

     

    功能与效果:

    灰度拉伸和灰度的线性变换有点类似,都用到灰度的线性变换,但不同之处在于灰度拉伸不是完全的线性变换,而是分段进行线性变换。


    灰度拉伸可以更加灵活的控制输出灰度直方图的分布,它可以有选择的拉伸某段灰度区间以改善输出图像。如上图,所示的变换函数的运算结果是将原图在a到b之间的灰度拉伸到c到d之间。如果一幅图像的灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率>1)物体灰度区间以改善图像;同样如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率<1)物体灰度区间以改善图像质量。

    原理与算法:

    当x<x1:           f(x) = y1/x1*x;

    当x1<=x<=x2: f(x) = (y2-y1)/(x2-x1)*(x-x1)+y1;

    当x>x2:           f(x) = (255-y2)/(255-x2)*(x-x2)+y2;    //其中x1,y1,x2,y2是图中ac,bd两个转折点的坐标。

     

    实现代码:

    int i=0;
     for(  i=0; i<=x1; i++ )
     {
      if( x1>0 )
      {
       bMap[i] = (BYTE)y1*i/x1;
      }
      else
      {
       bMap[i] = 0;
      }
     }
     for( ; i<=x2; i++ )
     {
      if( x2 != x1 )
      {
       bMap[i] = y1 + (BYTE)(y2-y1)*(i-x1)/(x2-x1);
      }
      else
      {
       bMap[ i ] = y1;
      }
     }
     for( ; i<256; i++ )
     {
      if( x1 != 255 )
      {
       bMap[i] = y2 + (BYTE)(255-y2)*(i-x2)/(255-x2);
      }
      else
      {
       bMap[i] = 255;
      }
     }
     for( int i=0; i<iPixelHeight; i++ )
      for( int j=0; j<iPixelWidth; j++ )
      {
       //指向像素数据的第i行,第j列/个像素的指针
       lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-i) + j; //lLineBytes * (lHeight-1-i) + j???不懂
       lpSrc = bMap[lpSrc]
      }

    展开全文
  • 灰度拉伸.py

    2021-05-15 00:10:50
    灰度拉伸.py
  • matlab 灰度拉伸

    2016-10-24 22:27:59
    在matlab的GUI中,实现图像的灰度拉伸,要求有灵活的(a,a’)点、(b,b’)点的选择,即鼠标交互。
  • 图片灰度拉伸

    2016-12-03 10:33:39
    利用opencv 实现的灰度拉伸效果 可以直接运行
  • 图像灰度拉伸

    2012-12-05 10:54:10
    灰度拉伸,C# 代码和运行,有相机拍照,打开图像,保存图像等功能,其中图像的灰度直方图是自写控件
  • 图像处理灰度拉伸

    2013-09-12 18:56:55
    基于MFC的程序开发,利用图像处理中的灰度拉伸来编辑代码
  • VC++实现图像点运算,包括:灰度直方图,灰度拉伸,灰度均衡,灰度阈值变换,在VC6.0里运行无误
  • 这个函数提供灰度拉伸功能,输入图像应当是灰度图像,但如果提供的不是灰度 图像的话,函数会自动将图像转化为灰度形式。x1,x2,y1,y2应当使用双精度 类型存储,图像矩阵可以使用任何MATLAB支持的类型存储。
  • Delphi灰度拉伸代码实例..rar
  • 灰度拉伸算法

    2017-11-27 17:07:35
    该算法主要是在图像处理过程中对图像灰度进行拉伸处理。
  • 点运算VS2017编译通过,可直接运行 包括 图像反色 线性变换 阈值变换 窗口变换 灰度拉伸 灰度均衡
  • C#实现灰度拉伸源码

    热门讨论 2009-09-20 22:19:44
    灰度拉伸又叫对比度拉伸,C#方面的代码CSDN好像还没有,共享下赚点分。 由于环境光线或采集设置等原因,图像灰度常会集中于某一小区间。为便于观察和处理,常用分段线性变换曲线建立灰度映射来完成灰度拉伸使图像...
  • 数字图像的灰度拉伸

    2021-02-14 10:37:40
    通过灰度拉伸可加大图像的对比度,使图像变得更加清晰。 灰度拉伸分为线性拉伸和非线性拉伸两种方法。 1、线性拉伸对像素值进行线性比例变化,主要有以下几种方法: 全域线性拉伸 2%线性拉伸 分段线性拉伸 ...

    成像系统只能获取一定亮度范围内的值。由于成像系统的量化级数有限,常出现对比度不足的弊病,图像看起来比较模糊、暗淡。通过灰度拉伸可加大图像的对比度,使图像变得更加清晰。

    灰度拉伸分为线性拉伸和非线性拉伸两种方法。

    1、线性拉伸对像素值进行线性比例变化,主要有以下几种方法:

    • 全域线性拉伸
    • 2%线性拉伸
    • 分段线性拉伸
    • 灰度窗口切片(可将某一区间内的灰度级和其他部分分开)

    2、非线性拉伸使用非线性函数对图像进行拉伸变化,常用的非线性函数有指数函数、对数函数、平方根、高斯函数等。其中,指数变换对于图像中亮的部分,它扩大了灰度间隔,突出了细节;对于暗的部分,它缩小了灰度间隔,弱化了细节。与指数变换相反,对数变换主要用于拉伸图像中暗的部分,而压缩亮的部分。

    展开全文
  • 开发环境为QT5.8+opencv3.2,主要实现了图像点运算,包括图像反色,灰度拉伸,灰度均衡。
  • 图像增强—灰度拉伸

    千次阅读 2016-01-11 14:05:03
    灰度拉伸是一种图像增强算法,属于线性点运算的一种。灰度拉伸。也称对比度拉伸,是一种简单的线性点运算。它扩展图像的直方图,使其充满整个灰度级范围内。 设f(x,y)为输入图像,它的最小灰度级A和最大灰度级B的...

    灰度拉伸是一种图像增强算法,属于线性点运算的一种。灰度拉伸。也称对比度拉伸,是一种简单的线性点运算。它扩展图像的直方图,使其充满整个灰度级范围内。

    设f(x,y)为输入图像,它的最小灰度级A和最大灰度级B的定义,如下:

    A = min[f(x,y)]    B = max[f(x,y)]

    将A和B分别线性映射到0和255,最终得到的图像g(x,y)为:

     

    void Stretch(unsigned char *pGrey,int nWidth, int nHeight)
    {
    	unsigned char Max_Grey=0,Min_Grey=255;
    	int			  i,nMulti;
    	float		  fInter;
    	nMulti = nWidth * nHeight;
    	for (i=0; i<nMulti; i++)
    	{
    		Max_Grey = Max_Grey>pGrey[i]?Max_Grey:pGrey[i];
    		Min_Grey = Min_Grey<pGrey[i]?Min_Grey:pGrey[i];
    	}
    	fInter = 255.0 / (float)(Max_Grey - Min_Grey);
    	for (i=0; i<nMulti; i++)
    	{
    		pGrey[i] = fInter * (pGrey[i]	- Min_Grey);
    	}
    }

     

     

     

     

     

    展开全文
  • 图像的灰度拉伸、直方图均衡化处理、GUI界面 matlab图像处理学生作业
  • 关于灰度拉伸的一点思考

    千次阅读 2019-09-28 09:17:58
    由于在日光下,原本就是白色或者是黄色的车道线会比较得很不清晰,于是很自然的想到了灰度拉伸的方案,从少量数据来看的结果,是好的。以下图为例,左图是三通道图,中间是利用opencv的cvtColor函数转换的灰度图,...

            最近在做项目,涉及到车道的检测。由于在日光下,原本就是白色或者是黄色的车道线会比较得很不清晰,于是很自然的想到了灰度拉伸的方案,从少量数据来看的结果,是好的。以下图为例,左图是三通道图,中间是利用opencv的cvtColor函数转换的灰度图,可以看到在右侧日光照射下的车道显得很不清晰,所以对高灰度值区域进行灰度拉伸,可以得到有图,显然车道清晰了很多。虽然由此左侧的车道没有原本那么明显了,但也还在可以接受的范围。

             然后今天在探索能否实现自适应的拉伸方案时,用了自己手机拍摄的一张图片观察处理前后的灰度直方图,发现了一些特殊的情况。绘制灰度直方图和实现灰度拉伸的函数如下。

    void GrayLinearTransform(Mat input, Mat &output, double x1 = 160, double y1 = 120, double x2 = 220, double y2 = 240);
    void CheckGrayHist(Mat img)
    {
        if (img.channels() == 3) {
            /*三通道图像,暂时不符合我们单通道灰度直方的需求.*/
            cout << "Error" << endl;
        }
        else {
    	    /*图像是单通道的*/
            //Mat gray;
            //cvtColor(img, gray, COLOR_BGR2GRAY);
    
            int histsize = 256;
            float range[] = { 0, 256 };
            const float * histrange(range);
    
            //存放直方图的计算结果,是一个256*1的矩阵
            Mat gray_hist;
            calcHist(&img, 1, { 0 }, Mat(), gray_hist, 1, &histsize, &histrange, true, false);
            //cout << gray_hist.cols << "," << gray_hist.rows << endl;
    		
            //定义每个灰度值在图上的宽度
            int bin_w = 4;
            int histImageHeight = 500;
            int histImageWidth = bin_w*histsize;
            //画出来是1024x500的图片,定义的时候是先行后列,与后续读取数值是不同的!!
            Mat histImage(histImageHeight, histImageWidth, CV_8UC3, Scalar(0, 0, 0));
    		
            //对结果进行归一化,才可以绘制到图像中
            normalize(gray_hist, gray_hist, 0, histImageHeight, NORM_MINMAX, -1, Mat());
    
            for (int i = 1; i < histsize; i++)
            {
            //绘制直方图,用折线图来替代通常的直方图,意义是一致的
                line(histImage, Point(bin_w *(i - 1), histImageHeight - cvRound(gray_hist.at<float>(i - 1))),
                    Point(bin_w * i, histImageHeight - cvRound(gray_hist.at<float>(i))), Scalar(255, 255, 255), 2);
            }
            //打印图片
            namedWindow(OUTPUT_TITLE, WINDOW_NORMAL);
            imshow(OUTPUT_TITLE, histImage);
            //imwrite("hist01.jpg", histImage);
            waitKey(0);
            destroyAllWindows();
        }
    }
    void GrayLinearTransform(Mat input, Mat & output, double x1, double y1, double x2, double y2)
    {
        /*灰度拉伸。经过几次试验发现,车道线无论是白色还是黄色,总会是图像中的高亮区域,无论白天或者是有路灯照射的
        晚上,所以可以把拉伸区域定在高灰度值领域。我们将通过两个点(x1, y1), (x2, y2),其中 255 > x2 > x1, 255 > y2 > y1
    	来确定我们的分段函数的新形式。
    	
                             |  y1/x1*old_gray_value, if old_gray_value <= x1
        new_gray_value =     |  (y2 - y1)/(x2 - x1)*(old_gray_value - x1) + y1, if x1 < old_gray_value <= x2
                             |  (255 - y2)/(255 - x2)*(old_gray_value - x2) + y2, if x2 < old_gray_value
        */
        for (int col = 0; col < input.cols; ++col)
        {
            for (int row = 0; row < input.rows; ++row)
            {
                //ogv = old gray value, 即原图的灰度值
                double ogv = input.at<uchar>(col, row);
                if (ogv < x1) {
                    output.at<uchar>(col, row) = static_cast<uchar>(y1 / x1 * ogv);
                }
                else if (x1 <= ogv && ogv < x2) {
                    output.at<uchar>(col, row) = static_cast<uchar>((y2 - y1) / (x2 - x1)*(ogv - x1) + y1);
                }
                else {
                    output.at<uchar>(col, row) = static_cast<uchar>((255 - y2) / (255 - x2)*(ogv - x2) + y2); }
            }
        }
    }
    

                  将前后两张直方图进行比较如上。我设置的划分多段函数的两个点分别是(160, 120),(220, 240),但从图片上看也确实可以看出把图片的高亮区域给拉伸得更加清晰了,但是直方图上却出现了很多奇怪的波形。虽然说灰度直方图,并不是完全连续的,没有必须是如第一张图那么连续的道理,但是通常来说这种很严重的波动必然是人为干预引起的。

            原因也很显然,因为在做灰度拉伸时,是对灰度值带入到函数中,计算的结果基本都不是一个整数,所以需要取整。例如我们设置的两个点是(160, 120),(220, 240),就意味着把0-160的数值压缩到0-120,简单的就是0-4压缩到0-3。[0, 1, 2, 3, 4] ---> [0, 0.75, 1.5, 2.25, 3],如果是简单的向下取整,那么结果是[0, 0, 1, 2, 3],也就是把1的所有值都加到0中去,所以原本连续的0-4就变得不连续了,变得有一个明显的突起。那如果是把小的范围拉伸到大的范围呢?160-220拉伸到120-240,也就是原本60的跨度变成了120,例如160 --> 120, 161 ---> 122,所以121这个位置就空了出来,也就出现了上图中有一段有一半的点为0的区域,正是对应了120-240中的奇数区域。

           说不会有什么影响,这个似乎倒不至于。对于肉眼所看到的图像并没有什么特别的边缘或者干扰,兴许有人会说那不要截断用cvRound有没有用?并没有哈哈哈,因为实质上都是把某个灰度值的所有点都给调整到另一个灰度值,只要是这种"全部"的操作,就会对灰度直方图有如上的影响。不过这种图像结果,实际上更多是因为我画图,并不是真正的直方图,而是将一个一个的点连接起来的折线图。如果画成直方图的形式应该就好了。

    /*
    for (int i = 1; i < histsize; i++)
    {    
        line(histImage, Point(bin_w *(i - 1), histImageHeight - cvRound(gray_hist.at<float>(i - 1))),
            Point(bin_w * i, histImageHeight - cvRound(gray_hist.at<float>(i))), Scalar(255, 255, 255), 2);
    }
    */
    for (int i = 0; i < histsize; i++)
    {
    	//绘制直方图
        line(histImage, Point(bin_w * i, histImageHeight),
            Point(bin_w * i, histImageHeight - cvRound(gray_hist.at<float>(i))), Scalar(255, 255, 255), 2);
    }

            

     

     

     

     

     

     

    展开全文
  • 精通系列\精通Visual C++数字图像处理技术与工程案例\chap01\灰度拉伸.rar
  • dm642下的视频图像处理,进行灰度拉伸
  • Python_OpenCV_灰度拉伸

    2021-03-17 09:17:41
    灰度拉伸 output=255/(B-A)*[img_gray-A] 其中,A为最小灰度级,B为最大灰度级 img_gray为输入图像,output为输出图像 缺点:若图像中最小灰度值=0,最大灰度值=255,则图像不会有什么改变 ''' import cv2 ...
  • 自己写的灰度拉伸算法实现,大家参考参考 GrayStrech(IplImage*src,IplImage*tmp,int bx,int ex,int by,int ey)
  • 下面要写一个书上的例子,就是利用查找表来完成灰度图像的灰度拉伸。 在写程序中,我们总希望提升运算的速度,特别是在实时检测中,程序运算时间的长短决定着算法到底能不能用。查找表是把事先计算好的数据存入数组...
  • 图像灰度拉神,主要是将图像的灰度拉伸至全灰度区间,计算公式如下: xaml代码 <Window x:Class="ImageProcess_GrayStretch.MainWindow" xmlns=...
  • 直方图均衡化,灰度拉伸,中值滤波,同态滤波程序
  • Python OpenCV实例:图像灰度拉伸

    千次阅读 2018-04-19 17:13:00
    灰度拉伸 定义:灰度拉伸,也称对比度拉伸,是一种简单的线性点运算。作用:扩展图像的 直方图,使其充满整个灰度等级范围内 公式: g(x,y) = 255 / (B - A) * [f(x,y) - A], 其中,A = min[f(x,y)],最...
  • 关于图像处理的,阈值变换,窗口变换,灰度拉伸等方面的VC++程序。
  • 全等级直方图灰度拉伸

    千次阅读 2017-09-07 15:53:31
    灰度拉伸属于线性点运算的一种。灰度拉伸。也称对比度拉伸,是一种简单的线性点运算。它扩展图像的直方图,使其充满整个灰度级范围内。 设f(x,y)为输入图像,它的最小灰度级A和最大灰度级B的定义,如下: A = ...
  • VC图像处理中 灰度拉伸的源程序和图片,源程序有注解。
  • 623灰度拉伸编程实例 结果: 直方图 灰度拉伸后 所学到的知识点: 1,intPtr 与 int 互转 int i=1; IntPtr p=new IntPtr(i); int ch_i=(int) p; 2,IntPtr和string互转 string str="a"; IntPtr p=Marshal....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,202
精华内容 2,480
关键字:

灰度拉伸