栅格图像灰度值的累加求和,如何优化空间复杂度

dianyancao 2013-02-02 11:03:21
输入一副灰度栅格图像,和某一个栅格(x,y),其灰度值为g,
需要输出(x,y)的矩形邻域内灰度值小于g的栅格个数。


如下图,绿色单元格的灰度值为g,其坐标为(x,y)

用I(x,y,g)表示蓝色框部分中灰度值小于或等于g的单元格个数,
即(x,y)和左上角构成的矩形区域中单元格灰度值小于或等于g的单元格个数。

用S(y-1,g)表示红色框列部分中灰度值小于或等于g的单元格个数。

则S(y,g)=S(y-1,g)+1

I(x,y,g)=I(x-1,y,g)+S(y,g)

当更新S(y,g)时,更新所有大于g的S(y,g')
即S(y,g+1) += 1
S(y,g+2) += 1
S(y,g+3) += 1
...
S(y,255) += 1

该方法的时间复杂度一般和邻域大小无关,
但是要开辟n个和图像大小相同的空间,n是图像的灰度级。

如何降低该方法的空间复杂度呢?

...全文
503 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianyancao 2013-02-06
  • 打赏
  • 举报
回复
唉,错的一塌糊涂,下面这个才行
Public Sub SetI(Rect As RectStruct, SourceArray() As Long, TargetArray() As Long)
  Dim X As Long, Y As Long
  Dim g As Long
  Dim S() As Long
  Dim gg As Long
  
  ReDim TargetArray(Rect.Left - OutRangeLength To Rect.Right + OutRangeLength, Rect.Top - OutRangeLength To Rect.Bottom + OutRangeLength, 255)
  ReDim S(Rect.Top - OutRangeLength To Rect.Bottom + OutRangeLength, 255)
  
  For X = Rect.Left To Rect.Right
    For Y = Rect.Top To Rect.Bottom
      g = SourceArray(X, Y)
      
      For gg = 0 To g - 1
        S(Y, gg) = S(Y - 1, gg)
      Next gg
      For gg = g To 255
        S(Y, gg) = S(Y - 1, gg) + 1
      Next gg
      
      For gg = 0 To 255
        TargetArray(X, Y, gg) = TargetArray(X - 1, Y, gg) + S(Y, gg)
      Next gg
    Next Y
    
    ReDim S(Rect.Top - OutRangeLength To Rect.Bottom + OutRangeLength, 255)
  Next X
End Sub

Public Function GetP(Rect As RectStruct, OperateArray() As Long, g As Long) As Long
  GetP = OperateArray(Rect.Left - 1, Rect.Top - 1, g) - OperateArray(Rect.Right, Rect.Top - 1, g) - OperateArray(Rect.Left - 1, Rect.Bottom, g) + OperateArray(Rect.Right, Rect.Bottom, g)
End Function
dianyancao 2013-02-06
  • 打赏
  • 举报
回复
额,写错了,TargetArray(X, Y, g) = TargetArray(X - 1, Y, g) + S(Y, g)可以去掉
dianyancao 2013-02-06
  • 打赏
  • 举报
回复
呵呵,其实还没有开始写呢,不过空间使用太大了不实用,要256*n(n是图像大小)的空间
Public Sub SetI(Rect As RectStruct, SourceArray() As Long, TargetArray() As Long)
  Dim X As Long, Y As Long
  Dim g As Long
  Dim S() As Long
  Dim gg As Long
  
  ReDim TargetArray(Rect.Left - OutRangeLength To Rect.Right + OutRangeLength, Rect.Top - OutRangeLength To Rect.Bottom + OutRangeLength, 255)
  ReDim S(Rect.Top - OutRangeLength To Rect.Bottom + OutRangeLength, 255)
  
  For X = Rect.Left To Rect.Right
    For Y = Rect.Top To Rect.Bottom
      g = SourceArray(X, Y)
      For gg = 1 To g - 1
        S(Y, gg) = S(Y - 1, gg)
      Next gg
      For gg = g To 255
        S(Y, gg) = S(Y - 1, gg) + 1
      Next gg
      
      TargetArray(X, Y, g) = TargetArray(X - 1, Y, g) + S(Y, g)
      For gg = 1 To 255
        TargetArray(X, Y, gg) = TargetArray(X - 1, Y, gg) + S(Y, gg)
      Next gg
    Next Y
    
    ReDim S(Rect.Top - OutRangeLength To Rect.Bottom + OutRangeLength, 255)
  Next X
End Sub

Public Function GetP(Rect As RectStruct, OperateArray() As Long, g As Long) As Long
  GetP = OperateArray(Rect.Left - 1, Rect.Top - 1, g) - OperateArray(Rect.Right, Rect.Top - 1, g) - OperateArray(Rect.Left - 1, Rect.Bottom, g) + OperateArray(Rect.Right, Rect.Bottom, g)
End Function
cyxcw1 2013-02-05
  • 打赏
  • 举报
回复
LZ的意思是要建立一个与之相关的索引?按照楼主的方法建立索引的话,感觉空间复杂和时间复杂度都是挺高的(查询的话就很快,O(1)常数复杂度吧),而且对于变量g的话【0,255】,就应该另外开辟256*n(图像灰度级)的空间。 然后仔细一看,发现楼主的公式有些问题或者是我理解错误?看得头晕啊 一个点(x,y)的领域应该就是周围的几十个点吧?用遍历法计算空间复杂度是好低,时间复杂度不满足楼主 要求? 牺牲时间换空间,牺牲空间换时间,额。
dianyancao 2013-02-04
  • 打赏
  • 举报
回复
嗯,要计算很多不同的矩形邻域中灰度值小于等于g的像素 g和邻域都是变量,会有很多次查询 可以适当延长处理时间,而降低空间使用的大小吗?
cyxcw1 2013-02-04
  • 打赏
  • 举报
回复
P的公式我看得明白,其他的也看得懂,但是怎么看怎么像复杂化了啊? 我的思想是: P置零,从矩形的左上第一个单元开始遍历,然后如果该单元灰度值小于等于g,P++,遍历完为止。 楼主你看看?
cyxcw1 2013-02-04
  • 打赏
  • 举报
回复
额,不是很明白楼主的意思,楼主是想把该灰度图包含的所有的矩形区域的情况都算出来? 如果不是的话,简单的遍历那个矩形区域可以不?
dianyancao 2013-02-03
  • 打赏
  • 举报
回复
同样,当更新I(x,y,g)时,更新所有大于g的I(x,y,g') I(x,y,g+1) += S(y,g) I(x,y,g+2) += S(y,g) I(x,y,g+3) += S(y,g) ... I(x,y,255) += S(y,g) 对图像的所有像素栅格,应用上述操作后,求某个矩形区域Rect中灰度值小于或等于g的像素总数P, P=I(Rect.Left - 1, Rect.Top - 1, g) - I(Rect.Right, Rect.Top - 1, g) - I(Rect.Left - 1, Rect.Bottom, g) + I(Rect.Right, Rect.Bottom, g)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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