OpenCV232 這部份例程是去年做的
所以最近是不會再有更新了
我覺得還蠻有意義
是會繼續的
【22】伪色彩增强
伪彩色图像处理(也称假彩色)是根据特定的准则对灰度值赋以彩色的处理。
原图
int w = 640;
int h = 240;
src.create(cvSize(w, h), CV_8U);
for (int i=0; i<src.rows; ++i)
{
uchar *pt = src.ptr<uchar>(i);
for (int j=0; j<src.cols; ++j)
{
pt[j] = j;
}
}
直接用OpenCV的转换颜色函数
cvtColor(src, dst, CV_GRAY2RGB);
//失败,因为GRAY->RGB[A] R=Y G=Y B=Y A=0
这是cvchina上的一个算法
http://www.cvchina.info/2010/11/22/pseudocolor/#more-2153
说是讲某个点的灰度值按照9位 RGBRGBRGB取出R G B的数值
例如
(2)=(000 000 010)B分解出(000,100,000)B
然后再在后面补5个零够9位
那就是(000 000 000,010 000 000,000 000 000)B
就是灰度值2对应RGB(0,128,0)
是不是很晕
再来一个
(121) = (001 111 001)B分解出(010,010,111)B
然后补齐(001 000 000,001 000 000,111 000 00)B
就是灰度121对应RGB(64,64,224)
void myPseudocolorGeneration(InputArray src,OutputArray dst)
{
Mat red(1,256, CV_8U),green(1,256, CV_8U),blue(1,256, CV_8U);
int bit_per_channle = 3;
int bits_total = 3*bit_per_channle;
int color_num = 1<<bits_total;
for(int c = 0; c < color_num/2; c++)
{
int r = 0;
int g = 0;
int b = 0;
for(int k = 0; k < bits_total ; )
{
b = (b << 1) + ((c >> k++) & 1);
g = (g << 1) + ((c >> k++) & 1);
r = (r << 1) + ((c >> k++) & 1);
}
r = r << (8 - bit_per_channle);
g = g <&