2012-12-18 18 views
2

我正在尋找某個可用於獲取圖像與其重新縮小版本之間像素位置映射的公式。例如,我想知道在使用公式重新調整大小的版本中原始圖像中的當前像素是多少。即在行中,我只有列j_m,J_n,...中的像素出現在重新調整大小的版本中,其餘部分被刪除。我正在談論的是重新調整大小,只是縮放而沒有任何縱橫比保持或窗口平均。與圖像及其重新縮小版本之間的映射

感謝

+1

你知道縮放因子嗎? – mmgp

+0

當我看標籤,它實際上似乎是簡單的情況:) – Sam

+0

@mmgp是我知道比例因子 – user39576

回答

0

閱讀所有的意見後,我正好要達到什麼樣的困惑,所以你可能要原諒我可能在的naiveness這個答案。

基本知識:縮放圖像(信號,函數,任何東西)時應用標準縮放矩陣。本網站不允許正確的LaTeX內聯,因此請儘量理解以下表示。對於2D圖像,縮放矩陣由S = [sx 0; 0 sy]。由於我們對同時進行旋轉和平移不感興趣,因此將這種表示移動到齊次座標並沒有太多意義。矩陣很簡單,非常簡單。因此,例如,要將x乘以因子6,y乘以因子4,S = [6 0; 0 4]。將這個矩陣應用到每個點都會提供縮放圖像。以下是此應用中,原始圖像的一個直接的例子,並通過6倍縮放一個,4Y:

enter image description here     enter image description here

正如你看到的,也有按比例放大的明星有很多空白點。這就是爲什麼實際上通過逆比例縮放矩陣來執行放大。所提到的矩陣的倒數是平凡地獲得的,並且對應於S-1 = [1/s×0; 0 1/sy]。這樣做的好處是,插值基本上是執行逆變換的必要步驟,即您有一個離散的域,並且您獲得真實的位置,以處理您執行某種插值。以下是最簡單的插值法:通過將實數值截斷爲整數來實現最近鄰居。縮放倍率是,再次,6X和4Y,但在逆形式完成:

enter image description here

應該清楚,你可以不完全恢復縮放後的圖像(即使你知道的縮放因子)因爲縮放過程可以自由地在插值步驟中進行任何操作。但是,您可以直接在縮放的圖像中使用反轉因子直接應用縮放,以獲得未縮放圖像的近似值。在這個例子中,我們得到了下面的圖像,它恰好與原始圖像完全相同。

enter image description here

如果有幫助,在這裏是很簡單的Python代碼,體現討論了什麼問題。

import sys 
from PIL import Image 

img = Image.open(sys.argv[1]) # Assumed to be grayscale. 
width, height = img.size 
scale_x, scale_y = (6, 4) 
imo = img.load() 

# Upscale directly. 
full_img = Image.new('L', (width * scale_x, height * scale_y), 'white') 
im = full_img.load() 
for x in xrange(width): 
    for y in xrange(height): 
     im[x * scale_x, y * scale_y] = imo[x, y] 
full_img.save(sys.argv[2]) 

# Upscale by inverse transform. 
full_img = Image.new('L', (width * scale_x, height * scale_y), 'white') 
im = full_img.load() 
for x in xrange(width * scale_x): 
    for y in xrange(height * scale_y): 
     im[x, y] = imo[int(x/float(scale_x)), int(y/
      float(scale_y))] 
full_img.save(sys.argv[3]) 

# Downscale the previous upscaled image. 
downscaled = Image.new('L', (width, height), 'white') 
im2 = downscaled.load() 
for x in xrange(width * scale_x): 
    for y in xrange(height * scale_y): 
     im2[x/scale_x, y/scale_y] = im[x, y] 
downscaled.save(sys.argv[4]) 
+0

謝謝。想象一下,我擁有大明星的白色形象。然後,我將那個像素位置進行混洗,以獲得與白色星形圖像不相似的圖像。然後,我要重新將縮小後的尺寸縮小。然後,通過應用反向洗牌,我怎麼能夠得到一個圖像,這相當於將原始白色星星的大小應用而不洗牌?我希望你明白我的意思。 – user39576

+0

你的輸入是巨星,'f'和縮放因子('sx','sy')。現在讓我們假設你在'f'中用象素'b'交換象素'a'。然後你用'sx','sy'縮減'f'。在這個轉換之後,像素'a'以像素'b'位置結束,反之亦然。現在你想用'b'來「解除」a'。這是你的疑問/疑問嗎?如果你知道如何在'f'中完成混洗,並且如果這些點是在沒有內插的情況下進行變換的,那麼你只需考慮反比例因子即可解除混雜。在理解了答案中的轉換之後,這應該很清楚。 – mmgp

+0

我試圖實現它,但我得到的結果不是正確的重新調整版本。我想我要麼錯過了某些東西,要麼映射不能正常工作 – user39576