簡體   English   中英

使用 cv2.resize() 進行圖像插值更改整數位置像素

[英]Image interpolation with cv2.resize() changes the integer positon pixel

我正在嘗試使用cv2.resize()插入圖像,同時保持新圖像中的整數位置像素與原始圖像相同。 所以我寫了這段代碼來測試:

import cv2, scipy
import scipy.misc
import numpy as np

im = cv2.imread('img')
print(im[:,:,0].shape)
print(im[:,:,0])

im = cv2.resize(im, None, fx=2, fy=2, interpolation=cv2.INTER_LANCZOS4)

print(im[::2,::2,0].shape)
print(im[::2,::2,0])

輸出:

(128, 128)
[[79 62 64 ... 81 81 79]
 [73 59 57 ... 79 81 79]
 [69 51 51 ... 90 88 87]
 ...
 [40 48 43 ... 79 84 88]
 [45 46 44 ... 84 84 83]
 [48 46 44 ... 80 80 83]]
(128, 128)
[[82 66 63 ... 82 81 80]
 [76 64 57 ... 80 79 79]
 [71 57 50 ... 90 85 85]
 ...
 [38 46 45 ... 77 84 87]
 [43 46 45 ... 83 84 84]
 [48 47 44 ... 81 81 82]]

上面的代碼對圖像進行了 2x 插值,理想情況下兩個輸出應該相同,因為im[::2,::2,0]應該是插值前的像素。

代碼中是否有問題或無論如何正確執行?

我在某個時候找到了 OpenCV 坐標系的解釋,但找不到,所以這個答案來自記憶。

OpenCV 將像素視為一個小方塊,而不是網格中的點樣本。 整數量的插值將這個正方形分成更小的正方形。 對於偶數大小的插值,新的方形中心都不會與原始方形中心匹配。

對於奇數大小的插值,新方塊之一將位於中心,但在原始圖像左上角像素的頂部和左側也會有其他新方塊。 這些像素是外推的!

也就是說,如果您像我一樣將圖像視為一組樣本,那么 OpenCV 中的插值將永遠不會符合您的期望。

解決方案是在插值時將圖像向左和向上移動半個原始像素。 不知道如何在 OpenCV 中實現它。

或者你可以嘗試skimage.transform.rescale在skimage或diplib.Resampling在DIPlib(我是一個作家)。 對於最后一個,我知道它開箱即用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM