Python 为什么正在使用的图像是来自上一个进程的图像?

Python 为什么正在使用的图像是来自上一个进程的图像?,python,python-3.x,opencv,Python,Python 3.x,Opencv,很简单,我正在学习如何使用openCV/numpy编辑照片 我的问题是为什么第二个函数使用第一个函数创建的图像 我运行了两个函数——一个用于为列添加黑白颜色,另一个用于为行添加黑白颜色 import cv2 import numpy as np from matplotlib import pyplot as plt img_source = "brad.jpg" def read_image(image_source): #global img, width, height

很简单,我正在学习如何使用
openCV
/
numpy
编辑照片

我的问题是为什么第二个函数使用第一个函数创建的图像

我运行了两个函数——一个用于为列添加黑白颜色,另一个用于为行添加黑白颜色

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_source = "brad.jpg"

def read_image(image_source):
    #global img, width, height
    img = cv2.imread(image_source, 1)
    height, width = img.shape[:2]
    print("Image size: x ", width, " y ", height)
    return img, width, height

def black_and_white_cols(image_source):
    width_adjustment = 100
    total_cols = round(width / width_adjustment,0)
    edited_image = image_source
    bw_image = cv2.imread(img_source, 0)
    # The next line is to convert to the right interface
    # https://stackoverflow.com/questions/11067962/is-it-possible-to-have-black-and-white-and-color-image-on-same-window-by-using-o
    bw_image_b = cv2.cvtColor(bw_image,cv2.COLOR_GRAY2BGR)

    for x in range(1, int(total_cols), 2):
        top_row = 0
        bottom_row = height
        left_col = x*width_adjustment
        right_col = (x * width_adjustment) + width_adjustment
        bw_part = bw_image_b[top_row:bottom_row, left_col:right_col]
        edited_image[top_row:bottom_row, left_col:right_col] = bw_part
    show_image(edited_image)

def black_and_white_cols(image_source):
    width_adjustment = 100
    total_cols = round(width / width_adjustment,0)
    edited_image = image_source
    bw_image = cv2.imread(img_source, 0)
    # The next line is to convert to the right interface
    # https://stackoverflow.com/questions/11067962/is-it-possible-to-have-black-and-white-and-color-image-on-same-window-by-using-o
    bw_image_b = cv2.cvtColor(bw_image,cv2.COLOR_GRAY2BGR)

    for x in range(1, int(total_cols), 2):
        top_row = 0
        bottom_row = height
        left_col = x*width_adjustment
        right_col = (x * width_adjustment) + width_adjustment
        bw_part = bw_image_b[top_row:bottom_row, left_col:right_col]
        edited_image[top_row:bottom_row, left_col:right_col] = bw_part
    show_image(edited_image)
    return edited_image

def black_and_white_rows(image_source):
    width_adjustment = 100
    edited_image = image_source
    total_rows = round(height / width_adjustment,0)
    bw_image = cv2.imread(img_source, 0)
    bw_image_b = cv2.cvtColor(bw_image,cv2.COLOR_GRAY2BGR)

    for x in range(1, int(total_rows), 2):
        top_row = x * width_adjustment
        bottom_row = (x * width_adjustment) + width_adjustment
        left_col = 0
        right_col = width
        bw_part = bw_image_b[top_row:bottom_row, left_col:right_col]
        edited_image[top_row:bottom_row, left_col:right_col] = bw_part

    show_image(edited_image)

def show_image(image_source):
    cv2.imshow('This is your image', image_source)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    img, width, height = read_image(img_source)
    new_image = black_and_white_cols(img)
    new_image_2 = black_and_white_rows(img)
第一个函数运行良好,但第二个函数使用第一个函数中创建的图像,因此我得到黑白的行和列

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_source = "brad.jpg"

def read_image(image_source):
    #global img, width, height
    img = cv2.imread(image_source, 1)
    height, width = img.shape[:2]
    print("Image size: x ", width, " y ", height)
    return img, width, height

def black_and_white_cols(image_source):
    width_adjustment = 100
    total_cols = round(width / width_adjustment,0)
    edited_image = image_source
    bw_image = cv2.imread(img_source, 0)
    # The next line is to convert to the right interface
    # https://stackoverflow.com/questions/11067962/is-it-possible-to-have-black-and-white-and-color-image-on-same-window-by-using-o
    bw_image_b = cv2.cvtColor(bw_image,cv2.COLOR_GRAY2BGR)

    for x in range(1, int(total_cols), 2):
        top_row = 0
        bottom_row = height
        left_col = x*width_adjustment
        right_col = (x * width_adjustment) + width_adjustment
        bw_part = bw_image_b[top_row:bottom_row, left_col:right_col]
        edited_image[top_row:bottom_row, left_col:right_col] = bw_part
    show_image(edited_image)

def black_and_white_cols(image_source):
    width_adjustment = 100
    total_cols = round(width / width_adjustment,0)
    edited_image = image_source
    bw_image = cv2.imread(img_source, 0)
    # The next line is to convert to the right interface
    # https://stackoverflow.com/questions/11067962/is-it-possible-to-have-black-and-white-and-color-image-on-same-window-by-using-o
    bw_image_b = cv2.cvtColor(bw_image,cv2.COLOR_GRAY2BGR)

    for x in range(1, int(total_cols), 2):
        top_row = 0
        bottom_row = height
        left_col = x*width_adjustment
        right_col = (x * width_adjustment) + width_adjustment
        bw_part = bw_image_b[top_row:bottom_row, left_col:right_col]
        edited_image[top_row:bottom_row, left_col:right_col] = bw_part
    show_image(edited_image)
    return edited_image

def black_and_white_rows(image_source):
    width_adjustment = 100
    edited_image = image_source
    total_rows = round(height / width_adjustment,0)
    bw_image = cv2.imread(img_source, 0)
    bw_image_b = cv2.cvtColor(bw_image,cv2.COLOR_GRAY2BGR)

    for x in range(1, int(total_rows), 2):
        top_row = x * width_adjustment
        bottom_row = (x * width_adjustment) + width_adjustment
        left_col = 0
        right_col = width
        bw_part = bw_image_b[top_row:bottom_row, left_col:right_col]
        edited_image[top_row:bottom_row, left_col:right_col] = bw_part

    show_image(edited_image)

def show_image(image_source):
    cv2.imshow('This is your image', image_source)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    img, width, height = read_image(img_source)
    new_image = black_and_white_cols(img)
    new_image_2 = black_and_white_rows(img)
这是运行
new\u image=black\u and\u white\u cols(img)
后的图像

下面是运行
new\u image\u 2=…
之后的内容


为什么第二个图像保留黑白列?我通过
read\u image
使用非常原始的
img\u源代码
图像来调用它。为什么要使用列编辑的图像?

与注释中一样,当您执行
编辑的\u image=image\u source
时,您只复制指向图像数组的指针,而不克隆数组本身。你能行

edited\u image=image\u source.copy()


它将
image\u-source
复制到
edited\u-image

,因为它们共享相同的引用。可能您需要从copy import deepcopy复制
img\u-source
edited\u-image
是相同的图像,正如您在语句
edited\u-image=image\u-source>中定义的那样。因此,当您更改
edited\u image
时,您也在更改
image\u source
@kindall-因此,当我编辑图像时(就像我对
edited\u image[top\u row:bottom\u row,left\u col:right\u col]=bw\u part
所做的那样),这实际上是在编辑“真实图像”,即使我不保存它或
返回已编辑的\u图像
?如果解决方案有效,请将注释转换为答案,以便@BruceWayne可以接受它并将其关闭为“已解决”。