如何使用opencv多次更改图像中4个像素的颜色?
How to change the color of 4 pixels in an image, multiple times using opencv?
我正在尝试编写一个程序,将 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
谢谢!
在您的函数 bgr_vals
中,您采用参数 img
(这是当前补丁),但在该方法中,您无意中访问了此行中的 image
(整个图像):
b, g, r = image[x][y]
当您更正此拼写错误后,您的脚本可以正常工作。
以下是对未来的一些提示:
OpenCV(和大多数库)中的图像按行优先顺序存储,这意味着你应该写image[y][x]
或img[y][x]
。在你的情况下这无关紧要,但在未来的工作中它可能。
通常尝试使用非正方形图像测试您的程序,仅使用正方形图像进行测试是一个常见的陷阱
当你有级联循环时,不要在循环中使用相同的变量名(你两次都使用了 i)。同样,在您的情况下,这无关紧要,但是一旦您使用 i
的值,混乱就会开始
您可以直接使用循环变量,而不是在循环中增加 x、y,方法是获取一个带步长的范围:
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):
…
我正在尝试编写一个程序,将 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
谢谢!
在您的函数 bgr_vals
中,您采用参数 img
(这是当前补丁),但在该方法中,您无意中访问了此行中的 image
(整个图像):
b, g, r = image[x][y]
当您更正此拼写错误后,您的脚本可以正常工作。
以下是对未来的一些提示:
OpenCV(和大多数库)中的图像按行优先顺序存储,这意味着你应该写
image[y][x]
或img[y][x]
。在你的情况下这无关紧要,但在未来的工作中它可能。通常尝试使用非正方形图像测试您的程序,仅使用正方形图像进行测试是一个常见的陷阱
当你有级联循环时,不要在循环中使用相同的变量名(你两次都使用了 i)。同样,在您的情况下,这无关紧要,但是一旦您使用
i
的值,混乱就会开始您可以直接使用循环变量,而不是在循环中增加 x、y,方法是获取一个带步长的范围:
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): …