python-3.x - 如何使用opencv多次更改图像中4个像素的颜色?

标签 python-3.x opencv image-processing pixel

我正在尝试编写一个程序,将4个像素的平均颜色替换为4个像素的平均颜色,从而将480x480的图像转换为240x240的质量。然后,我对图像中的所有2x2正方形重复此操作。到目前为止,我的程序一直用左上 Angular 4个正方形的平均颜色替换整个图像,即bgr [150,138,126]。有人可以帮我看看我在做什么错吗?

def get_square(x1, x2, y1, y2):
    square = image[x1:x2, y1:y2]
    return square


def bgr_vals(img):
    b_vals, g_vals, r_vals = [], [], []
    x, y = 0, 0
    for i in range(4):
        b, g, r = image[x][y]
        b_vals.append(b)
        g_vals.append(g)
        r_vals.append(r)
        if y != 1:
            y += 1
        elif x == 0 and y == 1:
            x += 1
        elif x == 1 and y == 1:
            y -= 1
    return b_vals, g_vals, r_vals


def avg_color(bgr_vals):
    b_avg = np.average(bgr_vals[0])
    g_avg = np.average(bgr_vals[1])
    r_avg = np.average(bgr_vals[2])
    return [b_avg, g_avg, r_avg]


image = cv2.imread('src.jpg')

y1, y2 = 0, 2
for i in range(240):
    x1, x2 = 0, 2
    for i in range(240):
        patch = get_square(x1, x2, y1, y2)
        bgr_colors = bgr_vals(patch)
        color = avg_color(bgr_colors)
        image[x1:x2, y1:y2] = color
        x1 += 2
        x2 += 2
    y1 += 2
    y2 += 2
谢谢!

最佳答案

在函数bgr_vals中,您接受了参数img(这是当前补丁),但是在该方法中,您无意间在此行中访问了image(整个图像):

b, g, r = image[x][y]
修复此错字后,脚本可以正常工作。
以下是 future 的一些提示:
  • OpenCV(和大多数库)中的图像按行优先顺序存储,这意味着您应该编写image[y][x]img[y][x]。对于您而言,这并不重要,但在将来的工作中可能会如此。
  • 通常,尝试使用非正方形图像测试程序,仅使用正方形图像进行测试是常见的陷阱
  • 当您具有级联循环时,请不要在循环中使用相同的变量名(您两次都使用了i)。同样,在您的情况下,这并不重要,但是一旦您使用i的值,混淆就会开始
  • 除了在循环中增加x,y外,您还可以通过以下步骤直接使用loop变量:
    for y in range(0, 480, 2):
        for x in range(0, 480, 2):
            …
    
  • 使用数组形状代替硬编码维:
    for y in range(0, image.shape[0], 2):
        for x in range(0, image.shape[1], 2):
            …
    
  • 关于python-3.x - 如何使用opencv多次更改图像中4个像素的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62984525/

    相关文章:

    python - 模块未找到错误 : No module named 'SessionState

    python - 如何忽略存在空白值的行 Pandas Python

    visual-studio-2010 - 在OpenCV视频捕获上使用cvLine

    c++ - 彩色图像之间的相似度测量(OpenCV)

    python - 错误 : No module named 'fcntl'

    python-3.x - Python编辑csv文件的特定行和列

    python-3.x - 属性错误 : module 'cv2.cv2' has no attribute 'release'

    c++ - SurfDescriptorExtractor/featureDetector - IOS 中的 OpenCv

    php - 如何将 exif 数据添加到图像?

    iphone - 如何在运行时在 iPhone sdk 中删除图像背景