【问题标题】:How to change the color of 4 pixels in an image, multiple times using opencv?如何使用opencv多次更改图像中4个像素的颜色?
【发布时间】:2020-11-09 01:31:25
【问题描述】:

我正在尝试编写一个程序,将 480x480 图像转换为 240x240 质量,方法是采用 4 个像素的平均颜色并将所有 4 个像素替换为该平均颜色。然后我对图像中的所有 2x2 正方形重复此操作。到目前为止,我的程序一直用左上角 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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    b, g, r = image[x][y]
    

    修正此错字后,您的脚本运行良好。

    以下是一些关于未来的提示:

    1. OpenCV(和大多数库)中的图像以行优先顺序存储,这意味着您应该编写image[y][x]img[y][x]。在您的情况下,这无关紧要,但在未来的工作中可能会。

    2. 通常尝试使用非方形图像测试您的程序,仅使用方形图像进行测试是一个常见的陷阱

    3. 当您有级联循环时,不要在循环中使用相同的变量名(两次都使用了 i)。同样,在您的情况下,这并不重要,但只要您使用 i 的值,就会开始混淆

    4. 您可以直接使用循环变量,而不是在循环中增加 x, y,方法是通过一个步骤获取范围:

      for y in range(0, 480, 2):
          for x in range(0, 480, 2):
              …
      
    5. 使用数组形状而不是硬编码维度:

      for y in range(0, image.shape[0], 2):
          for x in range(0, image.shape[1], 2):
              …
      

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多