이미지를 가져 와서 이미지의 크기를 변경하고 싶지만 numpy 배열입니다.
예를 들어 코카콜라 병 이미지가 있습니다.
bottle-1
이것은 numpy 배열의 모양으로 변환되며 (528, 203, 3)
두 번째 이미지의 크기를 말하도록 크기를 조정하고 싶습니다.
bottle-2
모양이 (140, 54, 3)
.
원본 이미지를 유지하면서 이미지 크기를 특정 모양으로 변경하려면 어떻게합니까? 다른 답변은 다른 모든 행 또는 세 번째 행을 제거하는 것이 좋지만 기본적으로 이미지 편집기를 사용하지만 Python 코드로 이미지를 축소하는 것입니다. numpy / SciPy에서이를 수행 할 라이브러리가 있습니까?
답변
예, 설치 opencv
(이미지 처리 및 컴퓨터 비전에 사용되는 라이브러리)하고 cv2.resize
기능을 사용할 수 있습니다. 예를 들어 다음을 사용하십시오.
import cv2
import numpy as np
img = cv2.imread('your_image.jpg')
res = cv2.resize(img, dsize=(54, 140), interpolation=cv2.INTER_CUBIC)
여기 img
반면, 원본 이미지가 포함 된 NumPy와 어레이, 따라서이다 res
함유 NumPy와 배열 리사이즈 된 화상. 중요한 측면은 interpolation
매개 변수입니다. 이미지 크기를 조정하는 방법에는 여러 가지가 있습니다. 특히 이미지를 축소하고 원본 이미지 의 크기가 크기가 조정 된 이미지의 배수 가 아니기 때문에 특히 그렇습니다. 가능한 보간 스키마는 다음과 같습니다.
INTER_NEAREST
-가장 가까운 이웃 보간INTER_LINEAR
-쌍 선형 보간 (기본적으로 사용됨)INTER_AREA
-픽셀 영역 관계를 사용한 리샘플링. 무아레없는 결과를 제공하므로 이미지 데시 메이션에 선호되는 방법 일 수 있습니다. 그러나 이미지를 확대하면INTER_NEAREST
방법 과 비슷합니다
.INTER_CUBIC
-4×4 픽셀 이웃에 대한 쌍 입방 보간INTER_LANCZOS4
-8×8 픽셀 이웃에 대한 Lanczos 보간
대부분의 옵션과 마찬가지로 모든 크기 조정 스키마에 대해 하나의 전략이 다른 전략보다 선호 될 수있는 시나리오가 있다는 점에서 “최상의”옵션은 없습니다.
답변
이를 위해 numpy 만 사용하는 것이 가능할 수 있지만이 작업은 내장되어 있지 않습니다. 즉, scikit-image
(numpy에 구축 된)을 사용하여 이러한 종류의 이미지 조작을 수행 할 수 있습니다 .
Scikit-Image rescaling 문서는 여기에 있습니다 .
예를 들어 이미지로 다음을 수행 할 수 있습니다.
from skimage.transform import resize
bottle_resized = resize(bottle, (140, 54))
이것은 보간, 앤티 앨리어싱 등과 같은 것들을 처리 할 것입니다.
답변
numpy
머신 러닝 애플리케이션에서 사용하기 위해 배열 에서 이미지를 다운 샘플링하는 빠른 방법을 찾고있는 Google에서 여기에 오는 사람들을 위해 여기에서 채택한 초고속 방법이 있습니다 . 이 방법은 입력 차원이 출력 차원의 배수 인 경우에만 작동합니다.
다음 예제는 128×128에서 64×64로 다운 샘플링합니다 (쉽게 변경할 수 있음).
마지막 주문 채널
# large image is shape (128, 128, 3)
# small image is shape (64, 64, 3)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((output_size, bin_size,
output_size, bin_size, 3)).max(3).max(1)
채널 첫 주문
# large image is shape (3, 128, 128)
# small image is shape (3, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((3, output_size, bin_size,
output_size, bin_size)).max(4).max(2)
회색조 이미지의 3
경우 다음 1
과 같이 변경하십시오 .
채널 첫 주문
# large image is shape (1, 128, 128)
# small image is shape (1, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((1, output_size, bin_size,
output_size, bin_size)).max(4).max(2)
이 방법은 최대 풀링에 해당하는 방법을 사용합니다. 내가 찾은 가장 빠른 방법입니다.
답변
추가 라이브러리를 사용하지 않고 Python에서 이미지 크기를 조정 / 크기 조정하는 간단한 방법을 찾는 사람이 있다면 여기에 매우 간단한 이미지 크기 조정 기능이 있습니다.
#simple image scaling to (nR x nC) size
def scale(im, nR, nC):
nR0 = len(im) # source number of rows
nC0 = len(im[0]) # source number of columns
return [[ im[int(nR0 * r / nR)][int(nC0 * c / nC)]
for c in range(nC)] for r in range(nR)]
사용 예 : (30 x 30) 이미지 크기를 (100 x 200)으로 조정 :
import matplotlib.pyplot as plt
def sqr(x):
return x*x
def f(r, c, nR, nC):
return 1.0 if sqr(c - nC/2) + sqr(r - nR/2) < sqr(nC/4) else 0.0
# a red circle on a canvas of size (nR x nC)
def circ(nR, nC):
return [[ [f(r, c, nR, nC), 0, 0]
for c in range(nC)] for r in range(nR)]
plt.imshow(scale(circ(30, 30), 100, 200))
이것은 이미지를 축소 / 크기 조정하는 데 작동하며 numpy 배열에서 잘 작동합니다.
답변
SciPy의 imresize()
방법은 또 다른 크기 조정 방법 이었지만 SciPy v 1.3.0부터 제거됩니다. SciPy는 PIL 이미지 크기 조정 방법을 나타냅니다 .Image.resize(size, resample=0)
size – 요청 된 크기 (픽셀 단위), 2- 튜플 : (너비, 높이).
재 샘플 – 선택적 리샘플링 필터입니다. PIL.Image.NEAREST (가장 가까운 이웃 사용), PIL.Image.BILINEAR (선형 보간), PIL.Image.BICUBIC (입방 스플라인 보간) 또는 PIL.Image.LANCZOS (고품질 다운 샘플링 필터) 중 하나 일 수 있습니다. ). 생략하거나 이미지에 “1”또는 “P”모드가 있으면 PIL.Image.NEAREST로 설정됩니다.
여기 링크 :
https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
답변
numpy / SciPy에이를 수행 할 라이브러리가 있습니까?
확실한. OpenCV, scikit-image 또는 PIL없이이 작업을 수행 할 수 있습니다.
이미지 크기 조정은 기본적으로 원본 이미지의 각 픽셀 좌표를 크기 조정 된 위치로 매핑하는 것입니다.
이미지의 좌표는 정수 여야하므로 (매트릭스라고 생각하면) 매핑 된 좌표에 십진수 값이있는 경우 픽셀 값을 보간하여 정수 위치에 근사해야합니다 (예 : 해당 위치에 가장 가까운 픽셀을 얻는 것은 알려져 있음). 같은 가장 가까운 이웃 보간법 ).
이 보간을 수행하는 함수 만 있으면됩니다. SciPy에는 interpolate.interp2d
.
이를 사용하여 arr
다음과 같이 numpy 배열의 이미지 크기를 조정할 수 있습니다 .
W, H = arr.shape[:2]
new_W, new_H = (600,300)
xrange = lambda x: np.linspace(0, 1, x)
f = interp2d(xrange(W), xrange(H), arr, kind="linear")
new_arr = f(xrange(new_W), xrange(new_H))
물론 이미지가 RGB이면 각 채널에 대해 보간을 수행해야합니다.
더 자세한 내용을 알고 싶다면 이미지 크기 조정-컴퓨터 애호가를 시청하는 것이 좋습니다 .
답변
import cv2
import numpy as np
image_read = cv2.imread('filename.jpg',0)
original_image = np.asarray(image_read)
width , height = 452,452
resize_image = np.zeros(shape=(width,height))
for W in range(width):
for H in range(height):
new_width = int( W * original_image.shape[0] / width )
new_height = int( H * original_image.shape[1] / height )
resize_image[W][H] = original_image[new_width][new_height]
print("Resized image size : " , resize_image.shape)
cv2.imshow(resize_image)
cv2.waitKey(0)