2013-05-05 99 views
0

我有一個jpg圖像,使用PIL我正在獲取圖像的像素數據,對某些像素進行一些更改(循環排列RGB值)(使其他像素不變),然後將其保存爲新圖像。但是,其他像素的數據似乎正在發生變化?問題是什麼?這裏是代碼附加Python成像庫破壞像素數據

import numpy as np 
import Image as img 


def NumOcurr(DigArray,i): 
    val = DigArray[i] 
    count=0 
    for j in np.arange(i): 
     if (DigArray[j]==val): 
      count=count+1 
    return count   

def CycPermuteR(A): 
    t1 = A[0] 
    t2 = A[1] 
    t3 = A[2] 
    A[0] = t3 
    A[1] = t1 
    A[2] = t2 
    return A 
################################## 
### put the number in an array ### 
################################## 
number = np.loadtxt("C:\Users\Sthitadhi Roy\Documents\Pixel Data Encryption\Number.txt") 
DigArray = np.zeros(16) 

for i in np.arange(16): 
    DigArray[-1-i] = number%10 
    number = int(number/10) 

print DigArray 

################################## 
## Pixel Data for original ####### 
##################################  
OrigImg = img.open("C:\Users\Sthitadhi Roy\Documents\Pixel Data Encryption\Nondescript.jpg")    
PixelData = OrigImg.load() 
print PixelData[0,0] 
################################# 
## Change Pixel Data ############ 
################################# 
for i in range(16): 
    TempPixelData = PixelData[i,DigArray[i]] 
    TempPixelData = np.array(TempPixelData) 
    TPD = TempPixelData.copy() 
    CycPermuteR(TPD) 
    PixelData[i,DigArray[i]] = (TPD[0],TPD[1],TPD[2]) 

print PixelData[0,0]  
OrigImg.save("C:\Users\Sthitadhi Roy\Documents\Pixel Data Encryption\Modified.jpg") 

NewImg = img.open("C:\Users\Sthitadhi Roy\Documents\Pixel Data Encryption\Modified.jpg")    
PixelDataN = NewImg.load() 
print PixelDataN[0,0] 

這裏是輸出

[ 5. 2. 3. 6. 4. 5. 8. 7. 4. 5. 8. 3. 1. 2. 4. 8.] 
(148, 136, 98) 
(148, 136, 98) 
(146, 137, 108) 

正如你所看到的DigArray第0個元素是5,所以它應該離開[0,0]像素不變。用於更改像素數據的操作是正確的,因爲它也會使其保持不變,如輸出的第三行所示。但是在將它保存爲新圖像並重新加載之後,[0,0]像素不再具有相同的數據。

爲什麼會發生這種情況,如何解決?

回答

2

您正在保存圖像在JPEG format,這是一個壓縮和有損格式。

嘗試將圖像保存爲PNG,這是一種無損格式。

import os 
imagedir = "C:\Users\Sthitadhi Roy\Documents\Pixel Data Encryption" 

OrigImg.save(os.path.join(imagedir, "Modified.jpg"))