문제

내가 이미지를 열면 open("image.jpg"), 픽셀의 좌표가 있다고 가정하면 픽셀의 RGB 값을 어떻게 얻을 수 있습니까?

그렇다면 어떻게 이것의 반대를 할 수 있습니까? 빈 그래픽으로 시작하여 특정 RGB 값의 픽셀을 '쓰기'?

추가 라이브러리를 다운로드 할 필요가 없다면 선호합니다.

도움이 되었습니까?

해결책

아마도 사용하는 것이 가장 좋습니다 파이썬 이미지 라이브러리 내가 두려워하는이 작업을 수행하는 것은 별도의 다운로드입니다.

당신이 원하는 것을하는 가장 쉬운 방법은 이미지 객체의로드 () 메소드 배열처럼 조작 할 수있는 픽셀 액세스 개체를 반환합니다.

from PIL import Image

im = Image.open('dead_parrot.jpg') # Can be many different formats.
pix = im.load()
print im.size  # Get the width and hight of the image for iterating over
print pix[x,y]  # Get the RGBA Value of the a pixel of an image
pix[x,y] = value  # Set the RGBA Value of the image (tuple)
im.save('alive_parrot.png')  # Save the modified pixels as .png

또는,보십시오 Imagedraw 이미지를 만들기위한 훨씬 더 풍부한 API를 제공합니다.

다른 팁

PYPNG- 경량 PNG 디코더/엔코더

질문은 JPG를 암시하지만 내 대답이 일부 사람들에게 유용하기를 바랍니다.

다음은 PNG 픽셀을 읽고 쓰는 방법은 다음과 같습니다. pypng 모듈:

import png, array

point = (2, 10) # coordinates of pixel to be painted red

reader = png.Reader(filename='image.png')
w, h, pixels, metadata = reader.read_flat()
pixel_byte_width = 4 if metadata['alpha'] else 3
pixel_position = point[0] + point[1] * w
new_pixel_value = (255, 0, 0, 0) if metadata['alpha'] else (255, 0, 0)
pixels[
  pixel_position * pixel_byte_width :
  (pixel_position + 1) * pixel_byte_width] = array.array('B', new_pixel_value)

output = open('image-with-red-dot.png', 'wb')
writer = png.Writer(w, h, **metadata)
writer.write_array(output, pixels)
output.close()

PYPNG는 테스트 및 댓글을 포함하여 길이가 4000 줄 미만인 단일 순수한 파이썬 모듈입니다.

보다 포괄적 인 이미징 라이브러리이지만 상당히 무겁습니다.

사용 베개 (Python 3.x 및 Python 2.7+에서 작동 함)는 다음을 수행 할 수 있습니다.

from PIL import Image
im = Image.open('image.jpg', 'r')
width, height = im.size
pixel_values = list(im.getdata())

이제 모든 픽셀 값이 있습니다. RGB이거나 다른 모드를 읽을 수있는 경우 im.mode. 그런 다음 픽셀을 얻을 수 있습니다 (x, y) 에 의해:

pixel_values[width*y+x]

또는 Numpy를 사용하고 배열을 재구성 할 수 있습니다.

>>> pixel_values = numpy.array(pixel_values).reshape((width, height, 3))
>>> x, y = 0, 1
>>> pixel_values[x][y]
[ 18  18  12]

완전하고 간단한 사용 솔루션입니다

def get_image(image_path):
    """Get a numpy array of an image so that one can access values[x][y]."""
    image = Image.open(image_path, 'r')
    width, height = image.size
    pixel_values = list(image.getdata())
    if image.mode == 'RGB':
        channels = 3
    elif image.mode == 'L':
        channels = 1
    else:
        print("Unknown mode: %s" % image.mode)
        return None
    pixel_values = numpy.array(pixel_values).reshape((width, height, channels))
    return pixel_values

Dave Webb가 말했듯이 :

다음은 이미지에서 픽셀 색상을 인쇄하는 작업 코드 스 니펫입니다.

import os, sys
import Image

im = Image.open("image.jpg")
x = 3
y = 4

pix = im.load()
print pix[x,y]
photo = Image.open('IN.jpg') #your image
photo = photo.convert('RGB')

width = photo.size[0] #define W and H
height = photo.size[1]

for y in range(0, height): #each pixel has coordinates
    row = ""
    for x in range(0, width):

        RGB = photo.getpixel((x,y))
        R,G,B = RGB  #now you can use the RGB value

wiki.wxpython.org에 대한 정말 좋은 기사가 있습니다 이미지 작업. 이 기사는 WXWIDGETS (WXIMAGE), PIL 또는 PYTHONMAGICK 사용의 가능성을 언급합니다. 개인적으로, 나는 PIL과 WXWIDGET을 사용했으며 둘 다 이미지 조작을 상당히 쉽게 만듭니다.

당신이 사용할 수있는 피그 게임S Surfarray 모듈. 이 모듈에는 pixels3d (표면)라는 3D 픽셀 배열 반환 방법이 있습니다. 아래에 사용량을 보여주었습니다.

from pygame import surfarray, image, display
import pygame
import numpy #important to import

pygame.init()
image = image.load("myimagefile.jpg") #surface to render
resolution = (image.get_width(),image.get_height())
screen = display.set_mode(resolution) #create space for display
screen.blit(image, (0,0)) #superpose image on screen
display.flip()
surfarray.use_arraytype("numpy") #important!
screenpix = surfarray.pixels3d(image) #pixels in 3d array:
#[x][y][rgb]
for y in range(resolution[1]):
    for x in range(resolution[0]):
        for color in range(3):
            screenpix[x][y][color] += 128
            #reverting colors
screen.blit(surfarray.make_surface(screenpix), (0,0)) #superpose on screen
display.flip() #update display
while 1:
    print finished

도움이되기를 바랍니다. 마지막 단어 : 화면이 수명의 스크린 픽스를 위해 잠겨 있습니다.

이미지 조작은 복잡한 주제이며, 당신이 가장 좋습니다. 하다 라이브러리를 사용하십시오. 추천 할 수 있습니다 gdmodule 파이썬 내에서 다양한 이미지 형식에 쉽게 액세스 할 수 있습니다.

"sudo apt-get Python-Imaging 설치"명령을 사용하여 PIL을 설치하고 다음 프로그램을 실행하십시오. 이미지의 RGB 값을 인쇄합니다. 이미지가 큰 경우 '>'를 사용하여 출력을 파일로 리디렉션하는 경우 나중에 파일을 열려 RGB 값을 확인하십시오.

import PIL
import Image
FILENAME='fn.gif' #image can be in gif jpeg or png format 
im=Image.open(FILENAME).convert('RGB')
pix=im.load()
w=im.size[0]
h=im.size[1]
for i in range(w):
  for j in range(h):
    print pix[i,j]

TK GUI 툴킷의 표준 파이썬 인터페이스 인 Tkinter 모듈을 사용할 수 있으며 추가 다운로드가 필요하지 않습니다. 보다 https://docs.python.org/2/library/tkinter.html.

(Python 3의 경우 Tkinter는 Tkinter로 이름이 바뀌 었습니다)

RGB 값을 설정하는 방법은 다음과 같습니다.

#from http://tkinter.unpythonic.net/wiki/PhotoImage
from Tkinter import *

root = Tk()

def pixel(image, pos, color):
    """Place pixel at pos=(x,y) on image, with color=(r,g,b)."""
    r,g,b = color
    x,y = pos
    image.put("#%02x%02x%02x" % (r,g,b), (y, x))

photo = PhotoImage(width=32, height=32)

pixel(photo, (16,16), (255,0,0))  # One lone pixel in the middle...

label = Label(root, image=photo)
label.grid()
root.mainloop()

그리고 RGB를 얻으십시오 :

#from http://www.kosbie.net/cmu/spring-14/15-112/handouts/steganographyEncoder.py
def getRGB(image, x, y):
    value = image.get(x, y)
    return tuple(map(int, value.split(" ")))
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img=mpimg.imread('Cricket_ACT_official_logo.png')
imgplot = plt.imshow(img)
from PIL import Image
def rgb_of_pixel(img_path, x, y):
    im = Image.open(img_path).convert('RGB')
    r, g, b = im.getpixel((x, y))
    a = (r, g, b)
    return a

RGB 색상 코드 형태로 3 자리 숫자를 원한다면 다음 코드가이를 수행해야합니다.

i = Image.open(path)
pixels = i.load() # this is not a list, nor is it list()'able
width, height = i.size

all_pixels = []
for x in range(width):
    for y in range(height):
        cpixel = pixels[x, y]
        all_pixels.append(cpixel)

이것은 당신을 위해 효과가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top