关于灰度的一些知识(转)
灰度图像gray level image
在计算机领域中,灰度数 字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同 亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是, 在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。
灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的。
用 于显示的灰度图像通常用每个采样像素 8 位的非线性尺度来保存,这样可以有 256 级灰度。这种精度刚刚能够避免可见的条带失真,并且非常易于编程。在医学图像与遥感图像这些技术应用中经常采用更多的级数以充分利用每个采样 10 或 12 位的传感器精度,并且避免计算时的近似误差。在这样的应用领域每个采样 16 位即 65536 级得到流行。
二值图像
二 值图像是一种简单的图像格式,它只有两个灰度级,即"0"表示黑色的像素点,"255"表示白色的像素点。二值图像处理在图像处理领域占据很重要的位置, 在具体的图像处理应用系统中,往往需要对于获得的二值图像再进一步进行处理,以有利于后期的识别工作。二值图像处理运算是从数学形态学下的集合论方法发展 起来的,尽管它的基本运算很简单,但是却可以产生复杂的效果。常用的二值图像处理操作有许多方法,如腐蚀、膨胀、细化、开运算和闭运算等等。
ubject: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 10:54 Length: 1,718 byte(s)
[Original] [Print] [Top]
大家知道,16位的制式为r 5 g 6 b 5,最多能显示2的5次方(即32级灰度),现在16位,640*480的,framebuffer已经可以在我自己的TFT屏上正常运行,但是为了达到256级灰度必须改为24位的framebuffer,
arm是s3c2440,TFT屏是LG.PHILIPS LCD ,为了运行24位的framebuffer,我做了如下修改
1。我把16位驱动中的16位相关都改为24位的了,例如:
if ( var->bits_per_pixel == 24 ) {//change add
var->red.offset = 16; var->red.length = 8;
var->green.offset = 8; var->green.length = 8;
var->blue.offset = 0; var->blue.length = 8;
var->transp.offset = var->transp.length = 0;
}else if ( var->bits_per_pixel == 16 ) {
var->red.offset = 11; var->red.length = 5;
var->green.offset = 5; var->green.length = 6;
var->blue.offset = 0; var->blue.length = 5;
var->transp.offset = var->transp.length = 0;
}
2。因为16位的framebuffer可以运行,我没有修改5个控制寄存器,我修改了地址寄存器2,3,如下
/* 16bpp 24bpp*/
new_regs.lcdsaddr2 = LCDADDR_BASEL(
((unsigned long)VideoPhysicalTemp + (var->xres * 3 * (var->yres/*-1*/)))
>> 1);//change 2 to 3
new_regs.lcdsaddr3 = LCDADDR_OFFSET(0) | (LCDADDR_PAGE(var->xres*3/2) /*>> 1*/);
编译后运行,在屏幕上出现了(横4竖4)共16个小图象,都是24位的(用示波器检测过了),
这是怎么回事呢?是寄存器没有设置正确,还是在修改驱动时出现了问题呢?
本人新手,请大家指教,谢谢!!
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: gg940231 Posted: 2007-09-24 10:59 Length: 62 byte(s)
[Original] [Print] [Top]
好像只有 4级 ,16级灰度 吧,,,还没有听说过 256级灰度呢。。。
----
<< 发展才是硬道理 >> QQ:77291408 gg940231@163.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 11:05 Length: 192 byte(s)
[Original] [Print] [Top]
这里再做一些补充,和许多TFT屏一样我的TFT屏上只有18根数据线(R6 G6 B6),framebuffer作成24位的(R8G8B8),TFT上显示6位的数据(R6G6B6),这样就能显示64级灰度了,我的目标就是显示64级灰度。谢谢大家!
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 11:11 Length: 92 byte(s)
[Original] [Print] [Top]
24位的图象约有16M色的图象(即2的24次方),当RGB的值相等时显示为灰度,即2的8次方(256级灰度)
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: gg940231 Posted: 2007-09-24 11:22 Length: 89 byte(s)
[Original] [Print] [Top]
那你就直接用 16位TFT 的就可以了啊,在 gui 里去增加个函数, 转换 16位真彩色 到 你的 灰度。
----
<< 发展才是硬道理 >> QQ:77291408 gg940231@163.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 11:33 Length: 99 byte(s)
[Original] [Print] [Top]
这也行?怎么搞?
还有那个写GUI的会砍死我的,他本来任务就重,我还想搞完驱动去帮他一把呢!!
----
qq:554726623
email:freeubuntu@hotmail.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: gg940231 Posted: 2007-09-24 11:41 Length: 99 byte(s)
[Original] [Print] [Top]
不知道你用什么 GUI ,我的是 microwindows ,通常底层就是些,打点,划线的函数,看看吧,不复杂的。。。
----
<< 发展才是硬道理 >> QQ:77291408 gg940231@163.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: rocky1972 Posted: 2007-09-24 11:48 Length: 614 byte(s)
[Original] [Print] [Top]
**************************************************************************************
2。因为16位的framebuffer可以运行,我没有修改5个控制寄存器,我修改了地址寄存器2,3,如下
/* 16bpp 24bpp*/
new_regs.lcdsaddr2 = LCDADDR_BASEL(
((unsigned long)VideoPhysicalTemp + (var->xres * 3 * (var->yres/*-1*/)))
>> 1);//change 2 to 3
***************************************************************************************
16bpp换成24bpp当然还要修改LCD CON1的BPPMODE=TFT24BPP了,查看datasheet LCDCON1 寄存器一下。
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: rockos Posted: 2007-09-24 12:47 Length: 210 byte(s)
[Original] [Print] [Top]
晕~~~
2.6.20内核中包含的s3c24xx framebuffer驱动可以直接支持24位色, copy到你的版本就可以了.
这个版本的fb把lcdcon的功能基本上都实现了, 1, 2, 4, 8, 12, 16, 24位色模式都支持了.
----
不喜欢GPL, BSD的免费许可不错.
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 14:39 Length: 222 byte(s)
[Original] [Print] [Top]
对不起,这个我忘说了,控制寄存器1我改了的,如下:
.reg = {
/*111111000 这里把寄存器改为13*/
.lcdcon1 = (1<<8)|(1<<7)|(3<<5)|(13<<1),
----
qq:554726623
email:freeubuntu@hotmail.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 15:11 Length: 118 byte(s)
[Original] [Print] [Top]
有这等好事!原来我用的是2.6.12的内核,我马上下一个2.6.20的内核看一下,
要知后事如何,且听下回分解。
----
qq:554726623
email:freeubuntu@hotmail.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 15:58 Length: 65 byte(s)
[Original] [Print] [Top]
2.6.20中的framebuffer我看了一下,不行啊,要改很多地方吧
----
qq:554726623
email:freeubuntu@hotmail.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-24 18:42 Length: 1,647 byte(s)
[Original] [Print] [Top]
我已经仔细看过了2.6.20.6内核中的s3c2410fb.c,我发现这个也是16位的。如下:
if (fbi->mach_info->type == S3C2410_LCDCON1_TFT)
switch (var->bits_per_pixel) {
case 1:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_TFT1BPP;
break;
case 2:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_TFT2BPP;
break;
case 4:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_TFT4BPP;
break;
case 8:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_TFT8BPP;
break;
case 16:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_TFT16BPP;
break;
default:
/* invalid pixel depth */
dev_err(fbi->dev, "invalid bpp %d ", var->bits_per_pixel);
}
else
switch (var->bits_per_pixel) {
case 1:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_STN1BPP;
break;
case 2:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_STN2GREY;
break;
case 4:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_STN4GREY;
break;
case 8:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_STN8BPP;
break;
case 12:
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_STN12BPP;
break;
default:
/* invalid pixel depth */
dev_err(fbi->dev, "invalid bpp %d ", var->bits_per_pixel);
}
----
qq:554726623
email:freeubuntu@hotmail.com
[Original] [Print] [Top]
Subject: Re: 为显示256级灰度图,需把16bpp的framebuffer改为24位,请高手指点一二
Author: freeubuntu Posted: 2007-09-27 15:44 Length: 91 byte(s)
[Original] [Print] [Top]
现在已经确定是寄存器设置的问题了,在bootloader中对logo 进行同样的寄存器设置也出现了16幅图象