2017-10-16 32 views
0

很簡單,我正在學習如何與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) 

這是new_image = black_and_white_cols(img)運行後的圖像。

enter image description here

這裏後new_image_2 = ...運行的。

enter image description here

爲什麼第二圖像保持黑白列?我使用非常原始的img_source圖片通過read_image調用它。爲什麼它使用列編輯圖像?

+0

,因爲它們共享相同的參考。 – Sraw

+0

也許你需要'從拷貝導入deepcopy'? – Sraw

+1

'img_source'和'edited_image'是相同的圖像,就像您將它們定義爲語句'edited_image = image_source'一樣。因此,當你改變'edited_image'時,你也在改變'image_source'。 – kindall

回答

1

正如評論,當你做edited_image = image_source,你只有指針複製到圖像陣列,而不是克隆數組本身。你可以做

edited_image = image_source.copy()

其拷貝到image_sourceedited_image