[英]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.