怎么“最快”找出图象里颜色重复次数最大的点?

橘子皮... 2012-04-09 12:53:25
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Type RGBQUAD
Blue As Byte
Green As Byte
Red As Byte
Reserved As Byte
End Type

Private lWidth&, lHeight&
Private p() As RGBQUAD

Private Sub Command1_Click()
Dim v() As Long
Randomize

lWidth = 300: lHeight = 300
ReDim p(1 To lWidth, 1 To lHeight)

For j = 1 To lHeight
For i = 1 To lWidth
p(i, j).Red = Fix(Rnd * 256)
p(i, j).Blue = Fix(Rnd * 256)
p(i, j).Green = Fix(Rnd * 256)
Next
Next

'如何写?把数量最大,和数量第2,第3这3个点的颜色放进v()里就行了
End Sub

不能用创立一个超大数组的办法,最效率的办法是什么?怎么写?
...全文
267 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2012-04-17
  • 打赏
  • 举报
回复
计数的方法很多,例如数据库。建一个数据库表 points,字段为 Red(Byte), Blue(Byte), Green(Byte), Count(Long).

For j = 1 To lHeight
For i = 1 To lWidth
p(i, j).Red = Fix(Rnd * 256)
p(i, j).Blue = Fix(Rnd * 256)
p(i, j).Green = Fix(Rnd * 256)
Set rs = cn.Execute("SELECT * FROM pints WHERE Red =" & p(i, j).Red & " AND Blue = " & p(i, j).Blue & " AND Green=" & p(i, j).Green)
If rs.EOF Then
cn.Execute "INSERT points(Red, Blue, Green, Count) VALUES(" & p(i, j).Red & "," & p(i, j).Blue & "," & p(i, j).Green & ",1)"
Else
cn.Execute "Update points SET Count = Count + 1 WHERE Red =" & p(i, j).Red & " AND Blue = " & p(i, j).Blue & " AND Green=" & p(i, j).Green
End If
Next
Next

Set rs = cn.Execute("SELECT TOP 3 * FROM points ORDER BY Count DESC")
王二.麻子 2012-04-16
  • 打赏
  • 举报
回复
有些图片文件里面有像素索引,在像素诗句里面不是像素的颜色,而是索引号.在颜色索引表里面有每个索引对应的颜色.

从已有的索引表触发,可以先知道共有多少个颜色在这个文件.创建一个新的索引,然后扫描整个图片,发现某个像素索引,就给新建的索引表里面的数据+1

这样还是要扫描整个图片,但是颜色索引小了很多了,不必建立全部颜色.

比如一个索引表
0:rgb(1,2,3)
1:rgb(2,3,4)
...
图像:1,0,1,1,1,0....

新索引:NewIndex(0 to NumColor)

扫描时候:
NewIndex(Pixels(i))=NewIndex(Pixels(i))+1

最后只要在NewIndex找到最大元素就可以了.
橘子皮... 2012-04-16
  • 打赏
  • 举报
回复
谁写个散列的写法? 学习学习
橘子皮... 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

先不要考虑算法,确定一些基本事实。

如果要知道图像中像素的颜色分布,不可避免地需要遍历所有的点。也就是说,至少需要做一次扫描。

至于排序等算法,我看就算了,它引入了更多轮次的访问。楼主的需求只需最大的一种颜色,而排序为了获得所有颜色的次序,做了更多无用的运算。

我能想到的优化只要一点,那就是当一种颜色的计数超过了所有象素的一半时,就可以终止扫描。也就是说,在此特殊情况下,可以小……
[/Quote]

你看错题目了,我的确不是只需要最大的颜色,很多时候需要第2和第3的颜色,或第4和第5的颜色,因为最大色可能是背景色,所以的确需要找出所有颜色的顺序
of123 2012-04-16
  • 打赏
  • 举报
回复
先不要考虑算法,确定一些基本事实。

如果要知道图像中像素的颜色分布,不可避免地需要遍历所有的点。也就是说,至少需要做一次扫描。

至于排序等算法,我看就算了,它引入了更多轮次的访问。楼主的需求只需最大的一种颜色,而排序为了获得所有颜色的次序,做了更多无用的运算。

我能想到的优化只要一点,那就是当一种颜色的计数超过了所有象素的一半时,就可以终止扫描。也就是说,在此特殊情况下,可以小于一次扫描。
worldy 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
谁写个散列的写法? 学习学习
[/Quote]

去我的资源里下载
worldy 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
先不要考虑算法,确定一些基本事实。

如果要知道图像中像素的颜色分布,不可避免地需要遍历所有的点。也就是说,至少需要做一次扫描。

至于排序等算法,我看就算了,它引入了更多轮次的访问。楼主的需求只需最大的一种颜色,而排序为了获得所有颜色的次序,做了更多无用的运算。

我能想到的优化只要一点,那就是当一种颜色的计数超过了所有象素的一半时,就可以终止扫描。也就是说,在此特殊情况下,可以小于……
[/Quote]

老兄,如果对每个颜色计数?没有计数,如何知道哪个颜色出现频率最多?
of123 2012-04-16
  • 打赏
  • 举报
回复
你看错题目了,我的确不是只需要最大的颜色,很多时候需要第2和第3的颜色,或第4和第5的颜色,因为最大色可能是背景色,所以的确需要找出所有颜色的顺序

-------------------------------------------------------------------------------------

即使是需要列出所有颜色的排序,也只需一次扫描。

其实,在最大数量色像素未达到 1/2 总像素前,找一个最大色和找多个最大色没有区别。因为你还不知道哪一个是最大色。


dianyancao 2012-04-16
  • 打赏
  • 举报
回复
哈~有点让我想起了一个人,WowIFlower,What a beautiful flower恶之花,好坏啊
橘子皮... 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 7 楼 的回复:

在算法中,时间(快)和空间(小)通常是对立的。
要“最快”就不能限制空间使用,“又快又小”通常是做不到的。

顶老鸟.

一些编码算法,例如CRC,一般有实时运算法与查表法两种写法.实时运算法速度慢,但代码占内存小;查表法需要拥有固定大小的一张表,但速度快.

如果又快又占内存小,那可就牛了.
[/Quote]

那按你说的就得用2^24超大数组了?那如果调用30个线程,那不是要占用好大的内存哦,总感觉不爽。。。
apples20008 2012-04-15
  • 打赏
  • 举报
回复
这个问题不应该在vb里解决
dianyancao 2012-04-14
  • 打赏
  • 举报
回复
赖皮一下,呵呵,如果可以破坏原来点的排列,快速排序后能很快找出相同颜色数量最大的点
呵呵,如果是 Reserved As Long就更容易了
嗷嗷叫的老马 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

在算法中,时间(快)和空间(小)通常是对立的。
要“最快”就不能限制空间使用,“又快又小”通常是做不到的。
[/Quote]
顶老鸟.

一些编码算法,例如CRC,一般有实时运算法与查表法两种写法.实时运算法速度慢,但代码占内存小;查表法需要拥有固定大小的一张表,但速度快.

如果又快又占内存小,那可就牛了.
橘子皮... 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

编译exe后,使用散列表计算1049X481像素为:15526360 178875 219ms

这个性能应该很不错了
[/Quote]

代码呢?
worldy 2012-04-11
  • 打赏
  • 举报
回复
编译exe后,使用散列表计算1049X481像素为:15526360 178875 219ms

这个性能应该很不错了
现在还是人类 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
你尝试一下“八叉树”算法看看

怎讲?赐教
[/Quote]
其实过程也就是循环完所有的像素颜色,再循环途中按照八叉树的算法方式排列到相应的结构数组里,最后分析结构数组得出相应的结果。具体的可以搜索“四叉树”、“八叉树”看看先关理论。但是不是能达到最快就难说了,不过效率应该会有所提高。
Tiger_Zhao 2012-04-10
  • 打赏
  • 举报
回复
在算法中,时间(快)和空间(小)通常是对立的。
要“最快”就不能限制空间使用,“又快又小”通常是做不到的。
贝隆 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
你尝试一下“八叉树”算法看看
[/Quote]
怎讲?赐教
现在还是人类 2012-04-09
  • 打赏
  • 举报
回复
你尝试一下“八叉树”算法看看
bcrun 2012-04-09
  • 打赏
  • 举报
回复
我只想到重复扫描一次的办法:()
另外,楼主的问题让我想到那些图片软件中显示图片的直方图的功能,不知他们是怎么弄的
加载更多回复(3)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧