2015-05-20 68 views
1

我試圖檢測圖像的邊緣。爲此,我寫了下面的代碼:像素值被不加修改地改變在OpenCV中蟒

import numpy as np 
import cv2 
import math 
img = cv2.imread('download.jpg',0) 
img1 = img 
k = img.shape 
i=1 
x=k[0] 
y=k[1] 
print x,y 
while(i<(x-2)): 
    j=1 
    while(j<(y-2)): 
     a = (int(img[i,j+1])-int(img[i,j])) 
     b = (int(img[i+1,j])-int(img[i,j])) 
     c = (a**2) + (b**2) 
     img1[i,j] = math.sqrt(c) 
     #img1[i,j] = a 
     j+=1 
    i+=1 
i=1 
print "img" 
print img 
print "img1" 
print img1 
print i,j 
cv2.imshow("image1",img1) 
cv2.imshow("image",img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

沒有在代碼中img被修改。然而,在代碼的最後,img的像素值被改變了(與img1相同)。任何人都可以解釋我什麼Iam失蹤?

+0

執行深層副本..即IMG1 = img.clone();而不是分配。 – ssh99

+0

不是問題的關鍵,但你的「邊緣檢測」簡直是梯度幅度。你可以使用numpy來更快地計算出來:'dy,dx = np.gradient(img);幅度= np.sqrt(dy ** 2 + dx ** 2))'。 –

回答

1

原因是,在Python賦值語句不復制對象, 你是後img1 = imgimgimg1仍指向同一個Image對象,你需要做一個副本,如果你需要獨立變異的對象

你也可以簡單實例兩個影像對象

img = cv2.imread('download.jpg', 0) 
img1 = cv2.imread('download.jpg', 0) 

否則,你就需要複製的Python對象img,如使用https://docs.python.org/2/library/copy.html