VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: jay36

[JSeeⅢ]图像处理,有多种滤镜,多提宝贵意见

[复制链接]
 楼主| 发表于 2006-10-15 13:22:51 | 显示全部楼层
原帖由 superzmy 于 2006-10-15 01:44 发表
全部使用picturebox 以及其他VB自带控件,不错
看起来只用了单个Form
有可能把 Picture传入一个Class示例使它拥有某种功能
上面仅凭观察猜测
颜色配合很好,让人感觉很爽
还有那么滤镜,代码都是原创的吧, ...


除了VB自带的控件之外,还有自编原创的一些控件(进度条、按钮、Slider)
大部分的滤镜是原创的,“特殊效果”里面的滤镜是在网上的源码的基础上优化而得。有一些滤镜是根据一些软件的滤镜效果自己试着做出来的。其中“模糊”花了很多时间去优化,现在的处理速度还算令人满意。

评分

参与人数 1威望 +1 收起 理由
dazuo0311 + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-17 17:46:04 | 显示全部楼层

唉 可怜啊

斑竹也没来看
也都没人再回帖了

只能自己顶一下咯
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-22 12:24:19 | 显示全部楼层

又稍作修改

10.20
增加剪贴板相关功能:
1.剪切、复制、粘贴
2.根据剪贴板图像大小自动调整新建图片的大小

JSeeⅢ_1022.rar

291.71 KB, 下载次数: 523

回复 支持 反对

使用道具 举报

发表于 2006-10-22 15:47:33 | 显示全部楼层
界面和功能都是值得赞扬的地方....
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-22 16:55:05 | 显示全部楼层
呵呵 新版本到现在还没人下载
唉 一共8+8=16个人使用过 不算少 可也不多啊 。。。
回复 支持 反对

使用道具 举报

发表于 2006-10-22 17:57:23 | 显示全部楼层
原帖由 jay36 于 2006-10-17 Tue PM 17:46 发表
斑竹也没来看
也都没人再回帖了

只能自己顶一下咯


我来也~

模糊花了很多时间研究? 看来你还得多多学习数字图像处理方面的书籍。

由于近日我也要再次研究模糊处理(为了cheapvista),所以略有想法。

比如均值模糊,
(A+B+C)/3  这种模糊方法不是很好,
(A+2*B+C)/4 而这种要比上面的快很多很多~ 不过由于vb不支持移位操作,所以反而要慢。

下面的就是标准的一维均值滤波(模糊)
FOR I=1 TO N-2 STEP 1
   ARY(I)=(ARY(I-1)+ARY(I)+ARY(I+1))/3
NEXT
这种方法的缺点是画面不对称,这可以从数学角度解释,这里就略了。
改进的方法是开辟一个临时变量储存ARY(I),具体的我不想多说,自己摸索吧。

另外,从数学角度来看,上面的这种经典算法还有一个问题,那就是画面变暗,特便是模糊强度过高的时候。

因为它会把原数据向零趋近。(就好比求导的时候,一般来说 导函数图像会越来越向x轴靠近)

解决方法也很好解决,不过如同前面的对称改进一样,会带来额外的计算量,所以个人还是推荐经典算法。

话又说回来,vb的确不是很适合开发高计算量的程序,这已经是公认的了,居然连
内嵌汇编都得走弯路才能模拟。

不知道vb.NET支不支持??

如果用汇编代码进行模糊处理,那么我可以做到最多用12个指令完成3个像素的处理。
不用汇编的代码:
R1=COLOR1 AND &HFF
R2=COLOR2 AND &HFF
..等等,提取R1 R2 R3 G1 G2 G3 B1 B2 B3 A1 A2 A3
A3=...
R=(R1+2*R2+R3)/4'红
G=(G1+2*G2+G3)/4'绿
B=(B1+2*B2+B3)/4'蓝
A=(A1+2*A2+A3)/4'透明通道
COLOR2=A*2^24+RGB(R,G,B)

然而,用汇编的话 12个指令就可以实现上面写的这些代码(包括从32位色中提取出R、G、B、A),
呵呵,如果不用汇编,那个计算量啊! 惨不忍睹。

[ 本帖最后由 sgdjr2003 于 2006-10-22 18:01 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-22 19:25:05 | 显示全部楼层
谢谢斑竹关于模糊的算法的介绍
模糊滤镜要达到效果并不难,我指的花了很多时间,是指花了很多时间去优化算法,也就是提速。

你所给出的代码只是模糊程度为1时的算法。也就是对于点(x,y)来说,只要取这一点周围坐标差为1的点的R、G、B的平均值就行

那么也就是算出
(x-1,y-1)   (x  ,y-1)   (x+1,y-1)
(x-1,y  )   (x  ,y  )   (x+1,y  )
(x-1,y+1)   (x  ,y+1)   (x+1,y+1)
这九点的R、G、B的平均值(其他算法也不过就是在这基础上加权再平均而已,差别不是很大)作为中间点(x,y)的RGB值。
(这种算法我称之为“原始算法”)

在此时,经过测试,也就是通过先+再÷直接进行计算的这种原始算法最直接,而且速度也不慢。(当然,计算这几个点的RGB值的和的时候用循环和不用循环的耗时差别还是比较明显的。要减少耗时,尽量少用循环。呵呵 代码多写几句,速度就能提高很多。)

我所说的优化并不是针对这种情况。(对于上面这种简单情况,原始算法比我的优化算法耗时非常接近,甚至更少)
我发现在模糊程度大于1,或者更大的时候,用原始算法所花费的时间是成几何级数增加的。
比如模糊程度=10的时候,就要计算(x,y)周围从(x-10,y-10)~(x+10,y+10)这个正方形区域中所有的点的均值,计算一个点就要把这21×21=441个点的R、G、B的和再平均。
那么如果模糊程度=100呢?计算量就是201×201=40401个点的R、G、B的和再平均。那么原始算法也好,楼主的算法也好,计算量都是非常巨大的。

在PS里面就是可以支持模糊程度在1~999之间的模糊处理。而网上很多范例只是在原始算法的基础上作了小小的改动,而速度并没有本质的提高,假如处理程度为999的模糊处理,那么耗时是非常长的。我所作的优化算法,可以处理程度任意大的模糊滤镜,而且速度非常快(我自己感觉并不比PS慢,呵呵,要慢也是VB本身的问题了)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-22 19:58:17 | 显示全部楼层

附上测试程序

附上测试程序

[ 本帖最后由 jay36 于 2006-10-22 20:03 编辑 ]

测试模糊速度.rar

70.17 KB, 下载次数: 469

测试模糊速度(开启所有高级优化选项).rar

65.97 KB, 下载次数: 505

回复 支持 反对

使用道具 举报

发表于 2006-10-22 20:20:08 | 显示全部楼层
原帖由 jay36 于 2006-10-22 Sun PM 19:25 发表
其他算法也不过就是在这基础上加权再平均而已,差别不是很大 ...


如果是VB,那么差别可以说没有,但如说用VC或其他,那么差距就出来了。

比如3x3的平均,8个加法,一个除法,除法的执行周期比乘法还要慢,仅次于浮点。
但如果把加权系数改为
1,2,1
2,4,2
1,2,1
K=16

那么速度就出来了,仅需要6个移位操作,移位比除法要快好多好多好多.....

至于优化嘛,这个我也研究过。

理论上说,将二维处理分解为两个一维处理,速度应该会快1.5倍左右,

另外,你也可以自己计算一下耗时。
比如 1Ghz的CPU,它每秒能处理一亿个指令

只要将你算法的总指令数一除即可,

比如
A=B+C ,这句至少2个指令。
MOV A,B;
ADD A,C;

当然,这些都是理论计算。
比如 640*480,3x3均值,模糊强度999,CPU:1GHz
那么,他的延时应该在1分钟左右(VB会更慢。),
不过这并不包括颜色的获取和绘制,

[ 本帖最后由 sgdjr2003 于 2006-10-22 20:39 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-22 20:29:56 | 显示全部楼层
呵呵我只对VB有比较深入的研究
所以我说的一些东西在VB里面讨论的。

楼主对于C和汇编的一些东西,我几乎是不了解的,也就没办法去比较(VB本身的缺陷就使它本来就不能跟C和汇编比)

如果要速度快,那么根本就不能用VB来做了
C或汇编会快很多,呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-1 19:34

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表