|
本帖最后由 灵之轨迹 于 2009-11-25 23:18 编辑
嘿嘿,最近看了一本叫《机器人导学》的书,这个程序的几个滤镜就来自其中对视觉处理的部分。
大家要是还有一些什么滤镜,都一起发上来吧!
我写的这个函数是可以支持多种滤镜的,就是 n x m 这样的区域掩膜。
因为使用SetPixel函数,速度有点慢,不过效果不错,但是觉得算法的效率不是太高,希望大家帮忙改进一下,谢谢大家了。
图片:
下面有源码下载。
主要代码:- Public Function PicFilter(ByVal hwnd1 As Long, ByVal hwnd2 As Long, ByRef filters() As Long, fx As Long, fy As Long, _
- ByVal xW As Long, ByVal yH As Long)
- 'On Error Resume Next
- Dim scr() As Long
- ReDim scr(2, xW, yH)
- Dim Afilters As Long, fxmid As Long, fymid As Long
- Dim i As Long, j As Long, k As Long, l As Long, m As Long
- Dim hdcP1 As Long, hdcP2 As Long
- hdcP1 = GetWindowDC(hwnd1)
- hdcP2 = GetWindowDC(hwnd2)
- For i = 0 To (fx * fy - 1)
- Afilters = Afilters + filters(i)
- Next
- If Afilters = 0 Then Afilters = 1
- For i = 0 To xW
- For j = 0 To yH
- Dim s As Long
- s = GetPixel(hdcP1, i, j)
- scr(0, i, j) = s Mod 256
- s = s \ 256
- scr(1, i, j) = s Mod 256
- s = s \ 256
- scr(2, i, j) = s Mod 256
- 'DoEvents
- Next
- Next
- fxmid = Int(fx / 2)
- fymid = Int(fy / 2)
- For i = 0 To xW
- For j = 0 To yH
- Dim t(2) As Long
- On Error Resume Next
-
- For k = 0 To 2
- t(k) = 0 '恢复
- Dim n As Long
- n = 0
- For m = 0 To fy - 1
- For l = 0 To fx - 1
- t(k) = t(k) + scr(k, i + l - fxmid, j + m - fymid) * filters(n)
- 'Debug.Print "( " & l - fxmid & "," & m - fymid & ") " & filters(n)
- n = n + 1
- Next l
- Next m
- t(k) = t(k) / Afilters
- If t(k) < 0 Then t(k) = 0
- If t(k) > 255 Then t(k) = 255
-
- DoEvents
- Next
-
- Call SetPixel(hdcP2, i, j, RGB(t(0), t(1), t(2)))
- Next
- Next
- '------------------------释放-------------------
- ReleaseDC hwnd1, hdcP1
- ReleaseDC hwnd2, hdcP2
- End Function
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
评分
-
查看全部评分
|