在图像 OpenCV 上滑动 window
Sliding window over an image OpenCV
我正在尝试定义扫描图像的 window,我想在每个 window 中找到平均 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
如何将这个平均函数应用于移动 window 并输出每个 window 的值?
编辑:
这是我现在拥有的:
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]
但现在我的输出为零。
使用形状等于您的 window 的内核进行过滤,所有值都等于 1/window_areas。结果是您寻求的本地平均值(也称为 "box blur" 操作)。
我写了一个类似于给定链接的脚本。它基本上将您的 img 分成 3*3 个部分,然后计算每个部分的平均值(和标准差)。通过一些数组优化,我认为你可以使用它真正的 time/on 视频。
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)
输出是每个 window:
的 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]
我正在尝试定义扫描图像的 window,我想在每个 window 中找到平均 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
如何将这个平均函数应用于移动 window 并输出每个 window 的值?
编辑:
这是我现在拥有的:
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]
但现在我的输出为零。
使用形状等于您的 window 的内核进行过滤,所有值都等于 1/window_areas。结果是您寻求的本地平均值(也称为 "box blur" 操作)。
我写了一个类似于给定链接的脚本。它基本上将您的 img 分成 3*3 个部分,然后计算每个部分的平均值(和标准差)。通过一些数组优化,我认为你可以使用它真正的 time/on 视频。
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)
输出是每个 window:
的 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]