2015-01-19 09:05:11 scottly1 阅读数 8994
• ###### MATLAB图像处理

全面系统的学习MATLAB在图像处理中的应用

19910 人正在学习 去看看 魏伟

```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);
```

2012-02-23 10:19:05 hellmonky 阅读数 6100
• ###### MATLAB图像处理

全面系统的学习MATLAB在图像处理中的应用

19910 人正在学习 去看看 魏伟

```im = imread('1.jpg','jpg');
im = double(im)./256;
r = im(:,:,1);
g = im(:,:,2);
b = im(:,:,3);
avgR = mean(mean(r));
avgG = mean(mean(g));
avgB = mean(mean(b));
avgGray = (avgR + avgG + avgB)/3;
if avgR == 0
outR = r;
else
outR = (avgGray/avgR).*r;
end

if avgG == 0
outG = g;
else
outG = (avgGray/avgG).*g;
end

if avgB == 0
outB = b;
else
outB = (avgGray/avgB).*b;
end

maxRGB = [max(max(outR)) max(max(outG)) max(max(outG))];

factor = max(maxRGB);
if  factor > 1
outR = outR./factor;
outG = outG./factor;
outB = outB./factor;
end

GWoutIm(:,:,1) = outR;
GWoutIm(:,:,2) = outG;
GWoutIm(:,:,3) = outB;

imshow(GWoutIm);

imwrite(GWoutIm, 'testout.jpg', 'jpg');

avgIn1RGB = [mean(mean(r)) mean(mean(g)) mean(mean(b))];
avgGW1RGB = [mean(mean(outR)) mean(mean(outG)) mean(mean(outB))];
avgIn1 = mean([mean(mean(r)) mean(mean(g)) mean(mean(b))]);
avgGW1 = mean([mean(mean(outR)) mean(mean(outG)) mean(mean(outB))]);```

2017-04-09 22:56:04 u013085897 阅读数 6609
• ###### MATLAB图像处理

全面系统的学习MATLAB在图像处理中的应用

19910 人正在学习 去看看 魏伟
本文算法摘自opencv，可以说opencv是一个大宝库，里面有无穷无尽的算法，但是opencv里面的算法属于研究性质，只能解决“有”的问题，还不能解决“好”的问题。比如下面的简单白平衡算法，核心思想是：在rgb三通道上分别计算直方图，然后将1%的最大值和最小值设置为255和0，其余值映射到(0, 255)区间内，这样使得每个通道的值均匀分布，以实现简单的颜色平衡。实际测试效果，对于某些图像效果还是可以的，尤其是偏色比较厉害的图像。不过该算法实现逻辑比较晦涩。
```#include "stdafx.h"
#include <cv.h>
#include <highgui.h>

using namespace cv;
using namespace std;

enum
{
WHITE_BALANCE_SIMPLE = 0,
WHITE_BALANCE_GRAYWORLD = 1
};

/*白平衡******************************************************************************************************************/
void balanceWhite(std::vector<Mat> &src, Mat &dst, const float inputMin, const float inputMax, const float outputMin, const float outputMax, const int algorithmType)
{
// 在rgb三通道上分别计算直方图
// 将1%的最大值和最小值设置为255和0
// 其余值映射到(0, 255), 这样使得每个值通道的值在rgb中分布较均匀, 以实现简单的颜色平衡
switch (algorithmType)
{
case WHITE_BALANCE_SIMPLE:
{
/********************* Simple white balance *********************/
float s1 = 1.0f;// low quantile
float s2 = 1.0f;// high quantile

int depth = 2;// depth of histogram tree
int bins = 16;// number of bins at each histogram level
int total = src[0].cols * src[0].rows;
int nElements = int(pow((float)bins, (float)depth));// number of elements in histogram tree

for (size_t k = 0; k < src.size(); ++k)
{
std::vector<int> hist(nElements, 0);
uchar *pImag = src[k].data;
// histogram filling
for (int i = 0; i < total; i++)
{
int pos = 0;
float minValue = inputMin - 0.5f;
float maxValue = inputMax + 0.5f;
float interval = float(maxValue - minValue) / bins;

uchar val = pImag[i];
for (int j = 0; j < depth; ++j)
{
int currentBin = int((val - minValue + 1e-4f) / interval);
++hist[pos + currentBin];

pos = (pos + currentBin)*bins;
minValue = minValue + currentBin*interval;
interval /= bins;
}
}

int p1 = 0, p2 = bins - 1;
int n1 = 0, n2 = total;
float minValue = inputMin - 0.5f;
float maxValue = inputMax + 0.5f;
float interval = float(maxValue - minValue) / bins;

// searching for s1 and s2
for (int j = 0; j < depth; ++j)
{
while (n1 + hist[p1] < s1 * total / 100.0f)
{
n1 += hist[p1++];
minValue += interval;
}
p1 *= bins;

while (n2 - hist[p2] > (100.0f - s2) * total / 100.0f)
{
n2 -= hist[p2--];
maxValue -= interval;
}
p2 = p2*bins - 1;

interval /= bins;
}

src[k] = (outputMax - outputMin) * (src[k] - minValue) / (maxValue - minValue) + outputMin;
}
/****************************************************************/
break;
}
default:
CV_Error_(CV_StsNotImplemented, ("Unsupported algorithm type (=%d)", algorithmType));
}// switch

merge(src, dst);
}

void balanceWhite(const Mat &src, Mat &dst, const int algorithmType, const float inputMin = 0.0f, const float inputMax = 255.0f, const float outputMin = 0.0f, const float outputMax = 255.0f)
{
switch (src.depth())
{
case CV_8U:
{
std::vector<Mat> mv;
split(src, mv);
balanceWhite(mv, dst, inputMin, inputMax, outputMin, outputMax, algorithmType);
break;
}
default:
CV_Error_(CV_StsNotImplemented, ("Unsupported source image format (=%d)", src.type()));
break;
}
}
/**************************************************************************************************************************/

int main()
{
const char* fileName = "dog.png" ;
imshow("src", src);

cv::Mat dst(src.size(), src. type());
balanceWhite(src, dst, WHITE_BALANCE_SIMPLE);
imshow("dst", dst);
imwrite("result.jpg", dst);

cv::waitKey();
return 0;
}```
效果如下：

简单的算法，有时也有神奇的一面，这也是做图像算法研究的一种乐趣。对于类似下面的图片，该算法还有去雾霾效果，不过由于该算法仅仅是统计并拉伸像素值，所以局限性很大，去雾霾效果如下：

参考资料：

2015-03-10 09:15:54 scottly1 阅读数 2306
• ###### MATLAB图像处理

全面系统的学习MATLAB在图像处理中的应用

19910 人正在学习 去看看 魏伟

2020-01-05 15:30:08 qq_42261630 阅读数 18
• ###### MATLAB图像处理

全面系统的学习MATLAB在图像处理中的应用

19910 人正在学习 去看看 魏伟

• 通俗理解白平衡

• 从工作原理理解白平衡

• 从色温色调角度理解白平衡

# 2.白平衡算法

• 灰度世界算法GW(自动白平衡)
• 全反射理论算法PR(自动白平衡最常用之一)
• GW和PR正交组合算法QCGP
• 色温估计法

https://blog.csdn.net/a6333230/article/details/82889842