在python(opencv)中更改像素值,而不知道坐标

在python(opencv)中更改像素值,而不知道坐标,python,opencv,image-processing,computer-vision,rgb,Python,Opencv,Image Processing,Computer Vision,Rgb,到目前为止,我的代码将图像分割为网格,然后找到网格每个区域的平均像素值。我现在尝试将网格每个区域内的所有像素值更改为区域的平均值,即3*3网格图像将有9个不同的像素值 # import packages import numpy as np import cv2 import dateutil import llist from matplotlib import pyplot as plt import argparse #read in image img = cv2.imread('im

到目前为止,我的代码将图像分割为网格,然后找到网格每个区域的平均像素值。我现在尝试将网格每个区域内的所有像素值更改为区域的平均值,即3*3网格图像将有9个不同的像素值

# import packages
import numpy as np
import cv2
import dateutil
import llist
from matplotlib import pyplot as plt
import argparse

#read in image
img = cv2.imread('images/0021.jpg')
scale = 3
#get x and y components of image
y_len,x_len,_ = img.shape

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


        mean_val=cv2.mean(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)
输出平均值数组如下所示:

[[[  25.91920573   32.65683594   79.10800781]
  [  47.4043099    67.91571615  159.6719401 ]
  [ 140.98916667  172.33229167  225.72739583]]

 [[  27.79309896   36.55742188  100.57583333]
  [  42.1552474    55.85042969  148.40445313]
  [  92.89833333  105.89760417  156.51497396]]

 [[  23.05854167   25.96677083   63.69509115]
  [  28.53105469   34.806875     98.81148438]
  [  30.2763151    35.97891927   80.45804688]]]
因此,数组的第一个元素将是第一个区域/网格/窗口的像素值。到处寻找帮助,但所有的例子似乎都需要像素坐标,我不一定知道它们


感谢您花时间阅读:

我不明白,在计算平均值时设置平均值是否有问题?将for循环与step选项一起使用,例如:for i in range0,lenimg,step:img[i:i+step]=cv2.mean img[i:i+step][0]。我在这里看到的唯一问题是确定步骤,你做得很好。@ljetibo也许我的问题不清楚,上面的代码工作正常,我可以计算每个窗口的平均值。我想做的是取这个平均值,让窗口中的所有像素都等于它。因此,使用上面的平均值数组,第一个窗口中的所有像素的BGR值为[25.91920573 32.65683594 79.10800781]。我不知道如何从数组中获取值并将其应用于图像。这就是我要告诉你的。cv2.imread以3D numpy数组的形式读取图像。所有设置和获取都完全等同于numpy数组。要访问像素的蓝色通道,您需要执行img[100][100][0]。设置为img[100][100][0]=10。要获取\设置整个第一行img[0][:]或img[0][:][0]=10,就像使用np.array一样。我目前在win7中,所以我没有cv2可用,但我可以在linux中测试,如果它不工作,我不明白为什么它不应该。如果cv2.mean不返回数组,只需使用np.mean,它肯定does@ljetibo-行得通。不需要测试。