2015-01-19 09:05:11 scottly1 阅读数 8988

白平衡,即所谓的白色的平衡。

白平衡的算法有很多,这里记录的是最简单实用的白平衡算法,即灰色世界法!

灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K。


下面是具体的算法代码:

RGB=imread('test.jpg');

R = RGB(:,:,1);      G = RGB(:,:,2);      B = RGB(:,:,3);
Rx4 = RGB(:,:,1)*4;  Gx4 = RGB(:,:,2)*4;  Bx4 = RGB(:,:,3)*4; //Rx4只是做了一个简单的线性的提亮,可以不用参考。

Rave = mean(mean(R)); 
Gave = mean(mean(G)); 
Bave = mean(mean(B));
Kave = (Rave + Gave + Bave) / 3;

R1 = (Kave/Rave)*R; G1 = (Kave/Gave)*G; B1 = (Kave/Bave)*B; 
R2 = (Kave/Rave)*Rx4; G2 = (Kave/Gave)*Gx4; B2 = (Kave/Bave)*Bx4; 

RGB_white = cat(3, R1, G1, B1);
RGB_whitex4 = cat(3, R2, G2, B2);

RGB_white_out = uint8(RGB_white); RGB_white_outx4 = uint8(RGB_whitex4);

下面是算法的效果:

原图:



白平衡之后:



可见,最原始的算法,效果还是不错的,后面有机会会补充其他好一些的算法。


注:原创文章,转载请注明出处: http://blog.csdn.net/scottly1/article/details/42741495


2017-10-12 17:01:29 mao_hui_fei 阅读数 13616

图像的表示与通道数问题

数字图像的基本概念
对于一幅的数字图像,我们看到的是 肉眼可见的一幅真正的图片,但是计算机看来,这副图像只是一堆亮度各异的点。一副尺寸为 M × N 的图像可以用一个 M × N 的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。

一般来说,灰度图用 2 维矩阵表示,彩色(多通道)图像用 3 维矩阵(M× N × 3)表示。

下面说说什么是通道数

*******************************************************************

通道数问题
描述一个像素点,如果是灰度,那么只需要一个数值来
描述它,就是单通道。

如果一个像素点,有RGB三种颜色来描述它,就是三通道。
而四通道图像,就是R、G、B加上一个A通道,表示透明度。一般叫做alpha通道,表示透明度的。
2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。

通过通道可以改变图像的色相和颜色,例如如果你保存红色通道,那么图像本身就只保留红色的元素和信息。
如果察看单个通道,发现每个通道都显示为一幅灰度图像(不能说是黑白图像)。某个通道的灰度图像中的明暗对应该通道色的明暗,从而表达出该色 光在整体图像上的分布情况。由于通道共有3个,所以也就有了3幅灰度图像。
通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。
 通道中的纯黑,代表了该色光在此处完全不发光,亮度级别是0。
 介于纯黑纯白之间的灰度,代表了不同的发光程度,亮度级别介于1至254之间。
 灰度中越偏白的部分,表示色光亮度值越高,越偏黑的部分则表示亮度值越低。
现在可以明白为何通道用灰度表示了吧?因为通道中色光亮度从最低到最高的特性,正符合灰度模式那种从黑到白过渡的表示。正是因为灰度的这种特性,使得它在以后还被应用到其它地方。通道中的灰度,与颜色调板的灰度滑块是对应的
一幅完整的图像,红色绿色蓝色三个通道缺一不可。即使图像中看起来没有蓝色,只能说蓝色光的亮度均为0,但不能说没有蓝色通道存在。
“存在、亮度为零”和“不存在”是两个不同的概念

******************************************************************************

接着再说说图像是如存储的,即使如何编码的:
如果是单通道图像,即灰度图,每个像素值用一个八位的二进制即可,如下图:
这里写图片描述
其中,I(ij)表示第i行第j列的亮度值。

如果是多通道图像,比如 RGB 图像,则每个像素用三个字节表示。在 OpenCV 中, RGB 图像的通道顺序为 BGR ,存储如下图 所示:
彩色RGB图像存储示意图

2016-11-27 20:04:23 Serious_Tanx 阅读数 8579

高斯滤波实际上是一种低通滤波器,也就是说,低波通过,高波滤去。对于图像来讲,就是在低频的部分通过,对于高频的地方滤去。对图像的边缘等细节部分进行模糊,这是由高斯模糊的公式的性质决定的。这点,经常在数字图像处理中利用,以在图像仿真图像重打样等领域进行利用。

那么,首先我们看公式。

这里写图片描述

σ是标准差,在这里又叫做高斯半径。σ2表示的意思就是方差。f(x)是概率,μ是均值,即期望。即这个公式表示的意思在μ附近的概率。离μ越近,即σ越小,其概率越大;离μ越远,即σ越大,其概率越小。σ的取值范围是[0.1~250]。

这里写图片描述

这个是高中学的部分,也就是一维正态分布,所以不做多的解释。

然后,是二维高斯曲面。

首先还是公式(x,y代表像素的模板坐标,模板中心位置为原点):

这里写图片描述

根据这个公式,我们可以计算得到不同σ的高斯模板。下面是C语言程序实现:

当σ即半径为0.7时:

#include "stdafx.h"
#include <fstream>
#include <math.h>
#include <iomanip>

using namespace std;

#define N 4
#define PI 3.141592653

int _tmain(int argc, _TCHAR* argv[])
{
    char* path = "C:\\path1.txt";
    ofstream fout(path);
    double a[2 * N + 1][2 * N + 1];    // 高斯模板;
    double r = 1;                     // 高斯半径;
    double A = 1 / (2 * PI * r * r);


    if (fout)
    {
        for (int i = -1 * N; i <= N; i++)
        {

            for (int j = -1 * N; j <= N; j++)
            {
                a[i + N][j + N] = A*exp((-1)*(i*i + j*j) / (2 * r*r));
                fout << setiosflags(ios::fixed) << setprecision(6) << a[i + N][j + N] << "   ";
            }
            fout << endl;
        }
    }
    fout.close();
    return 0;
}

最后得到的结果如下图所示:

这里写图片描述

那么,我们还有个问题,如何确定模板的大小与标准差之间的关系。经过我们的不断验证,即改变上述的σ和模板大小的值,可以得知。当σ越大时,要求的模板也就是越大。即当σ为1时,我们可以得到如下的高斯模板:

这里写图片描述

上图的意思是,与水平面平行的x,y平面,也就是上面高斯模板中的坐标(x,y),z轴表示的灰度值,也就是上面高斯模板中的灰度值。

通过上图我们可以得知,7*7的模板已经不能满足我们,我们需要9*9的模板,这时如果用5*5的模板,则会取中间部分的5*5模板。模板和σ的选择取决于我们图像的大小。如果图像是几万的分辨率,则需要高斯模板和σ值都要很大,如果几十的分辨率,用很小的如3*3的模板或者5*5的模板就可以了,这时σ一般可以取0.5左右(也就是matlab里fspecial函数里默认的σ值)。

得到的绘出的高斯曲面:

这里写图片描述

现在众所周知用的3*3或者5*5的模板,都是对高斯曲面的一个整数除法形式的近似,也就是对高斯半径约为0.849时的一个近似。

1 2 1
2 4 2 /16
1 2 1

16代表的是权重,即模板内所有的数之和。5*5的模板如下,也是对高斯曲面的一个整数除法形式的近似。

这里写图片描述

用matlab对图像进行高斯模糊:

image = imread('C:\lena.jpg');
w=fspecial('gaussian',[5 5],0.7);
im=imfilter(image,w);
imwrite(im,'C:\result.jpg','jpg');

这里写图片描述
原图

这里写图片描述
结果图

参考:http://www.cnblogs.com/hoodlum1980/archive/2008/03/03/1088567.html

2014-03-03 11:28:48 drrlalala 阅读数 794

1、比较通俗易懂的解释是:灰度图的通道数为1,彩色图的通道为3。基本上,描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB三种颜色来描述它,就是三通道。

  24通道通常为RGBA,在某些处理中可能会用到。2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。

 3、主要是有些摄像头常采用一些比较“古怪”的格式,没办法。补充一种情况,目前常见的一些摄像头喜欢采用YUV2等格式,格式如下YUYV,在处理的时候可以用4通道或者2通道来处理。如原格式为:Y1UY2V,插值成为Y1UV,Y2UV 就成两个彩色点了。YCrCb也有类似压缩情况。

 

   描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB三种颜色来描述它,就是三通道
windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,表示透明度

2009-11-19 16:09:00 xauatnwpu 阅读数 9679

无论是读入还是读出图像时,都要对图像的类型,位数,以及通道数进行相关的设置,其中通道数(channels)较令人费解:

 

整理一下OpenCV中文论坛里关于图像通道的问题,如下:

 

(1)图像的通道指的是什么?是不是灰度图的通道数为1,彩色图的通道为3?(zhuker)

正确!
基本上,描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。
如果一个像素点,有RGB三种颜色来描述它,就是三通道。(ollydbg23)

(2)对于2通道和4通道如何看待?哪位帮忙解释一下?(feixue)

我见过四通道的,两通道暂时没见过,估计只是编程的方便吧。windows的bmp有时候是一个四通道图像,R、G、B加上一个A通道,表示透明度。(eralvc)

是的,最后这个,一般叫做alpha通道,表示透明度的。(ollydbg23)

4通道通常为RGBA,在某些处理中可能会用到。
2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。
还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。(Loren)

主要是有些摄像头常采用一些比较“古怪”的格式,没办法。
补充一种情况,目前常见的一些摄像头喜欢采用YUV2等格式,格式如下YUYV,在处理的时候可以用4通道或者2通道来处理。
如原格式为:Y1UY2V,插值成为Y1UV,Y2UV 就成两个彩色点了。
YCrCb也有类似压缩情况。(Loren)

详见:http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4921&start=0&st=0&sk=t&sd=a&hilit=RGB

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenyusiyuan/archive/2009/10/13/4662783.aspx

 

没有更多推荐了,返回首页