2015-05-20 40 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