我想在R中缩放图像以进行进一步分析,而不是立即绘图。
如果我可以使用EBImage,EBImage的resize()将是理想的,但我需要避免它,所以我必须找到替代方案。我没有任何运气搜索。我可以手工实现双线性过滤,但在此之前,我想确认没有任何替代方案。
答案 0 :(得分:5)
Nearest neighbour调整大小是最常见和最简单的实现方式。
假设您的图像是一个图层/通道,因此是一个矩阵:
resizePixels = function(im, w, h) { pixels = as.vector(im) # initial width/height w1 = nrow(im) h1 = ncol(im) # target width/height w2 = w h2 = h # Create empty vector temp = vector('numeric', w2*h2) # Compute ratios x_ratio = w1/w2 y_ratio = h1/h2 # Do resizing for (i in 0:(h2-1)) { for (j in 0:(w2-1)) { px = floor(j*x_ratio) py = floor(i*y_ratio) temp[(i*w2)+j] = pixels[(py*w1)+px] } } m = matrix(temp, h2, w2) return(m) }
我会让你弄清楚如何将它应用于RGB图像
在此图片的红色通道上进行上述代码测试:
lena = readImage('~/Desktop/lena.jpg')[,,1]
display(lena)
r = resizePixels(lena, 150, 150)
display(r)
r2 = resizePixels(lena, 50, 50)
display(r2)
注意:
EBImage
,要读取/写入图片,请尝试使用jpeg
方法readJPEG
和writeJPEG
答案 1 :(得分:3)
可以非常容易地实现最近邻比例缩放(无插值) 虽然@ by0的答案很明确,但我想提供一个替代实现。 它适用于图像的矩阵表示,我发现它比索引到矢量更简单。
resizeImage = function(im, w.out, h.out) {
# function to resize an image
# im = input image, w.out = target width, h.out = target height
# Bonus: this works with non-square image scaling.
# initial width/height
w.in = nrow(im)
h.in = ncol(im)
# Create empty matrix
im.out = matrix(rep(0,w.out*h.out), nrow =w.out, ncol=h.out )
# Compute ratios -- final number of indices is n.out, spaced over range of 1:n.in
w_ratio = w.in/w.out
h_ratio = h.in/h.out
# Do resizing -- select appropriate indices
im.out <- im[ floor(w_ratio* 1:w.out), floor(h_ratio* 1:h.out)]
return(im.out)
}
这适用于任意图像缩放,而不仅仅是方形。另一方面,它只会保留图像的纵横比w.out/w.in = h.out/h.in
。