【问题标题】:Sliding window over an image OpenCV在图像 OpenCV 上滑动窗口
【发布时间】:2015-02-18 18:50:43
【问题描述】:

我正在尝试定义一个扫描图像的窗口,我想找到每个窗口中的平均 RGB 值并输出它们。

我设法得到了整个图像的平均 RGB 值,如下所示:

img = cv2.imread('images/0021.jpg')

mean = cv2.mean(img)

print mean[0]
print mean[1]
print mean[2]

给予:

#Output
51.0028081597
63.1069849537
123.663025174

如何将此均值函数应用于移动窗口并输出每个窗口的值?

编辑:

这是我现在拥有的:

img = cv2.imread('images/0021.jpg')

def new(img):
    rows,cols = img.shape
    final = np.zeros((rows, cols, 3, 3))
    for x in (0,1,2):
        for y in (0,1,2):
            img1 = np.vstack((img[x:],img[:x]))
            img1 = np.column_stack((img1[:,y:],img1[:,:y]))
            final[x::3,y::3] = np.swapaxes(img1.reshape(rows/3,3,cols/3,-1),1,2)
            b,g,r = cv2.split(final)
            rgb_img = cv2.merge([r,g,b])
            mean = cv2.mean(rgb_img)
            print mean[0]
            print mean[1]
            print mean[2]

但现在我的输出为零。

【问题讨论】:

  • 这应该会有所帮助:stackoverflow.com/questions/10896841/…
  • @runDOSrun 这确实有帮助,谢谢:) 但是当我将代码插入“fraxel”建议的 for 循环时,我现在没有输出?我是否需要对“final”做一些事情才能通过 cv2.mean() 函数对其进行解析?
  • 内核为 1/9 的 cv2.filter2D 怎么样?
  • @runDOSrun 我确实使用了打印语句,看看我上面帖子的编辑,你能看到我错过的任何明显的东西吗?
  • 不确定这对cv2.filter2D有什么帮助?

标签: python opencv computer-vision


【解决方案1】:

我编写了一个类似于给定链接的脚本。它基本上将您的 img 划分为 3*3 部分,然后计算每个部分的平均值(和标准差)。通过一些阵列优化,我认为您可以在实时/视频中使用它。

PS:除法应该是整数除法

编辑:现在脚本给出 9 个输出,每个输出代表其自己区域的平均值。

import numpy as np
import cv2

img=cv2.imread('aerial_me.jpg')
scale=3
y_len,x_len,_=img.shape

mean_values=[]
for y in range(scale):
for x in range(scale):
    cropped_image=img[(y*y_len)/scale:((y+1)*y_len)/scale,
                        (x*x_len)/scale:((x+1)*x_len)/scale]

    mean_val,std_dev=cv2.meanStdDev(cropped_image)
    mean_val=mean_val[:3]

    mean_values.append([mean_val])
mean_values=np.asarray(mean_values)
print mean_values.reshape(3,3,3)

输出是每个窗口的 bgr 平均值:

[[[  69.63661573   66.75843063   65.02066449]
  [ 118.39233345  114.72655391  116.14441964]
  [ 159.26887164  143.40760348  144.63208436]]

 [[  75.50831044  107.45708276  103.0781851 ]
  [ 108.46450034  141.52005495  139.84878949]
  [ 122.67583265  154.86071992  153.67907072]]

 [[  83.67678571  131.45284169  128.27706902]
  [  86.57919815  129.09968235  128.64439389]
  [  90.1102402   135.33173999  132.86622807]]]
[Finished in 0.5s]

【讨论】:

  • 感谢您的回复 :) 不过我不想裁剪图像,因为我的下一步是在视频序列上执行此操作,我觉得使用您的方法会使事情复杂化。
  • 我编辑了答案,请再看一遍。我想这就是你想要得到的。
  • 感谢您的回复。我将如何更改图像分割成的区域数量,比如我想要 6*6?
  • scale 参数就是为了这个目的。即如果你想将 6 除以 6,你应该改变 'scale=6' 。如果要打印矩阵,请使用 'mean_values.reshape(3,scale,scale)'
【解决方案2】:

过滤器的内核形状等于您的窗口,并且值都等于 1/window_areas。结果是您寻求的局部平均值(也称为“框模糊”操作)。

【讨论】:

  • 我不是试图通过平均像素和改变中心像素值来模糊图像,我只想输出每个 3x3 窗口的平均 rgb 值。
  • 这与复制原始图像并按照描述进行模糊处理不一样吗? (以通常的边界问题为模,您需要选择自己喜欢的卷积模式)
猜你喜欢
  • 2012-08-08
  • 2015-02-21
  • 2014-06-02
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多