현재 다음 방법을 찾으려고합니다.
Python을 사용하여 이미지 파일 읽기
모든 픽셀 값을 HSV
값 으로 읽기
이 값 배열을 먼저 정렬 H
한 다음 S
및 정렬V
새로 만든이 배열에서 numpy로 이미지를 만듭니다.
누군가 나를 올바른 방향으로 안내 할 수 있다면 매우 감사 할 것입니다.
편집 1 :
몇 가지 코드를 시도해 보았지만 결과가 나오지만 예상 한 것이 아닙니다. np.sort는 튜플을 열 중 하나가 아닌 총으로 정렬합니다. 누군가가 이것을 해결하는 방법에 대한 아이디어를 가지고있을 수 있습니다.
import glob
from PIL import Image, ImageDraw
import numpy as np
import os
import colorsys
#definition of HSL/HSV colorspace
def hsl(x):
to_float = lambda x : x / 255.0
(r, g, b) = map(to_float, x)
h, s, l = colorsys.rgb_to_hsv(r,g,b)
h = h if 0 < h else 1 # 0 -> 1
return h, s, l
#get the image filenames
images = glob.glob("test/*.jpg")
print(images)
#output_folder generation
output_folder = 'test/out_new'
if not os.path.exists(output_folder):
os.makedirs(output_folder)
#loop through all image filenames
for image in images:
#load the current image
im = Image.open(image)
#get a tuple of the x and y dimensions of the image
width, height = im.size
# creating empty img-array with same dimensions
data = np.zeros((height, width, 3), dtype=np.uint8)
#load the pixel info of image
pix = im.load()
width, height = im.size # get original size for processing
img_filename = os.path.splitext(image)[0]+'_sorted.jpg'
img_filename = os.path.split(img_filename)[1]
img_filename = os.path.join(output_folder, img_filename)
dataset = {}
for x in range(width):
for y in range(height):
h = (pix[x,y][0])
s = (pix[x,y][1])
l = (pix[x,y][2])
#make a unique id for this color to use as key
uid = f'{h},{s},{l}'
# use h,s,l pixel output for image. switched axis due to bug in
data[y][x] = [h, s, l]
# uncomment for r,g,b pixel output for image
#data[y][x] = [r, g, b]
if not uid in dataset:
dataset[uid] = 0
#count one up for this key
dataset[uid] += 1
# sort pixel
data_sorted = np.sort(data, axis=0)
# create image
newimage = Image.fromarray(data_sorted)
#newimage = Image.fromarray(data)
# save image
newimage.save(img_filename)
편집 2 : 제공된 코드 마크는 슬프게도 예상 된 결과를 산출하지 않습니다. 코드에 의해 생성 된 이미지는 원본 이미지와 동일한 색상의 픽셀을 포함해야하지만 정렬 된 방식이어야합니다. 따라서 원본의 모든 색상이 여전히 표시되어야합니다. 저는이 모든 것을 2 차원 이미지에서 H, S 및 V 배열의 3 차원을 (준) 시각화하는 방법을 만들기 위해 수행하고 있습니다.
원본 이미지 [1] : https://i.stack.imgur.com/hmiOE.jpg
마크 코드 [2]에 의해 생성 된 이미지 : https://i.stack.imgur.com/foHGC.jpg
지금까지 답변 해주셔서 감사합니다!
마크 코드는 실제로 HSV 로의 변환을 제안하면해야 할 일을합니다. 예제가 첨부되어 있습니다.
정렬 된 RGB 값 [3] : https://i.stack.imgur.com/WWiY1.jpg
다음은 원하는 작업을 수행하는 코드입니다.
#!/usr/bin/env python3
import numpy as np
from PIL import Image
# Load image and convert to HSV
im = Image.open('image.png').convert('HSV')
# Convert to Numpy array and reshape to column vector of HSV pixels
pv = np.array(im).reshape(-1,3)
# Sort by H, S, V and convert back to original shape
res = pv[np.lexsort((pv[:,2], pv[:,1],pv[:,0]))]
res = res.reshape((im.height,im.width,3))
# Convert back to PIL Image, back to RGB and save
Image.fromarray(res, mode='HSV').convert('RGB').save('result.png')
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다