পাইথনে প্রদত্ত পিক্সেলের আরজিবি মান কীভাবে পড়বেন?


140

যদি আমি ছবিটি খুলি open("image.jpg"), আমার কাছে পিক্সেলের স্থানাঙ্ক রয়েছে তা ধরে নিয়ে আমি কীভাবে পিক্সেলের আরজিবি মান পেতে পারি?

তারপরে, আমি কীভাবে এর বিপরীতটি করতে পারি? একটি খালি গ্রাফিক দিয়ে শুরু করে, একটি নির্দিষ্ট আরজিবি মান সহ একটি পিক্সেল 'লিখুন'?

আমি পছন্দ করি যদি আমার কোনও অতিরিক্ত লাইব্রেরি ডাউনলোড না করে থাকে।

উত্তর:


213

এটি করার জন্য পাইথন ইমেজ লাইব্রেরিটি ব্যবহার করা সম্ভবত সেরা which

আপনি যা চান তা করার সহজতম উপায় হ'ল চিত্র অবজেক্টের লোড () পদ্ধতির মাধ্যমে যা পিক্সেল অ্যাক্সেস অবজেক্টকে ফেরত দেয় যা আপনি অ্যারের মতো ম্যানিপুলেট করতে পারেন:

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

বিকল্পভাবে, ইমেজড্রে দেখুন যা চিত্রগুলি তৈরি করার জন্য আরও সমৃদ্ধ এপিআই দেয়।


1
সৌভাগ্যবশত ইনস্টল PIL লিনাক্স এবং উইন্ডোজ খুব সহজবোধ্য (Mac এর সম্পর্কে জানি না)
heltonbiker

6
আর্টারসাপেক, আমি পিআইএল ইনস্টল করেছি pipযার মাধ্যমে মোটামুটি সহজ ছিল।
মিচেল্লিউ

1
আমি এটি আমার ম্যাক (পাইপি) তে ব্যবহার করেছি:easy_install --find-links http://www.pythonware.com/products/pil/ Imaging
মাইজিড

15
ভবিষ্যতের পাঠকদের জন্য: pip install pillowসফলভাবে এবং মোটামুটি দ্রুত পিআইএল ইনস্টল করবে ( sudoযদি কোনও ভার্চুয়ালনেভে না হয় তবে প্রয়োজন হতে পারে )।
ক্রিস্টোফার শ্রোবা 30:55

pillow.readthedocs.io/en/latest/… উইন্ডোজ ইনস্টলেশন ধাপে bash কমান্ড প্রদর্শন করে। কীভাবে এগিয়ে যেতে হবে তা নিশ্চিত নয়।
Musixauce3000

31

ব্যবহার বালিশ (যা পাইথন যেমন 2.7+ পাশাপাশি পাইথন 3.x সঙ্গে কাজ করে), আপনি নিম্নলিখিতগুলি করতে পারেন:

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

এখন আপনার সমস্ত পিক্সেল মান আছে। এটি আরজিবি হলে বা অন্য কোনও মোড পড়তে পারে im.mode। তারপরে আপনি এর মাধ্যমে পিক্সেল পেতে পারেন (x, y):

pixel_values[width*y+x]

বিকল্পভাবে, আপনি নম্পি ব্যবহার করতে পারবেন এবং অ্যারে পুনরায় আকার দিন:

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

একটি সম্পূর্ণ, সমাধান সহজ সমাধান

# Third party modules
import numpy
from PIL import Image


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


image = get_image("gradient.png")

print(image[0])
print(image.shape)

কোড পরীক্ষা করে ধোঁয়া

প্রস্থ / উচ্চতা / চ্যানেলের ক্রম সম্পর্কে আপনি অনিশ্চিত হতে পারেন। এই কারণে আমি এই গ্রেডিয়েন্টটি তৈরি করেছি:

এখানে চিত্র বর্ণনা লিখুন

চিত্রটির প্রস্থ 100px এবং উচ্চতা 26px রয়েছে। এর একটি বর্ণ গ্রেডিয়েন্ট রয়েছে #ffaa00(হলুদ) থেকে #ffffff(সাদা) to আউটপুটটি হ'ল:

[[255 172   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   4]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]]
(100, 26, 3)

বিষয়গুলি নোট করুন:

  • আকৃতিটি (প্রস্থ, উচ্চতা, চ্যানেল)
  • image[0], অত প্রথম সারিতে, একই রং এর 26 triples হয়েছে

বালিশ ম্যাকোক্সে পাইথন ২.7 সমর্থন করে যখন আমি কেবল পিআইএল-তে পাইথন 2.5 সমর্থন পাই। ধন্যবাদ!
ক্যাঙ্গারু.এইচ

2
সতর্কতা অবলম্বন করুন, 'পুনর্নির্মাণ' প্যারামগুলির তালিকাটি হতে হবে (উচ্চতা, প্রস্থ, চ্যানেল) এবং আরজিবিএ চিত্রগুলির জন্য আপনি চ্যানেল = 4
gmarsi

@Gmarsi দ্বারা বিন্দু প্রস্থ এবং উচ্চতা সত্য? আসলেই কি উভয়ের বৈধতা আছে? আপনাকে কীভাবে ডেটা আউটপুট হবে তা সম্পর্কে সচেতন হওয়া দরকার যাতে আপনি জানেন যে আউটপুট অ্যারেটি কী আকার ধারণ করবে এবং চিত্রটির সারি এবং কলাম পিক্সেল ডেটা কোথায় থাকবে।
কিওশিকি

@ কিওসিকি আমার উত্তরে আমি একটি "ধূমপান পরীক্ষা" বিভাগ যুক্ত করেছি যাতে এটি বলা সহজ।
মার্টিন থোমা

24

পাইপএনজি - লাইটওয়েট পিএনজি ডিকোডার / এনকোডার

যদিও জেপিজিতে প্রশ্নটি ইঙ্গিত দিচ্ছে, আমি আশা করি আমার উত্তর কিছু লোকের পক্ষে কার্যকর হবে।

পিপিএনজি মডিউল ব্যবহার করে কীভাবে পিএনজি পিক্সেল পড়তে এবং লিখতে হবে তা এখানে :

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()

পাইপএনজি 4000 লাইনের কম লম্বা একক খাঁটি পাইথন মডিউল, পরীক্ষা ও মন্তব্য সহ।

পিআইএল হ'ল আরও বিস্তৃত ইমেজিং লাইব্রেরি, তবে এটি উল্লেখযোগ্যভাবে ভারী av


12

যেমন ডেভ ওয়েব বলেছেন:

এখানে একটি চিত্র থেকে পিক্সেল রঙ মুদ্রণ আমার ওয়ার্কিং কোড স্নিপেট:

import os, sys
import Image

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

pix = im.load()
print pix[x,y]

6
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

3

চিত্র ম্যানিপুলেশন একটি জটিল বিষয়, এবং এটা যদি আপনি সেরা না একটি লাইব্রেরি ব্যবহার করুন। আমি জিডি মডুলেলের প্রস্তাব দিতে পারি যা পাইথনের মধ্যে থেকে বিভিন্ন চিত্রের ফর্ম্যাটগুলিতে সহজে অ্যাক্সেস সরবরাহ করে।


কেউ কেন জানেন যে কেন এটিকে অবহেলা করা হয়েছিল? লিবিডজিডি বা কিছু নিয়ে কোনও সমস্যা আছে? (আমি এটির দিকে কখনও নজর দিইনি, তবে পিলের বিকল্প আছে কিনা তা জেনে সর্বদা ভালো লাগবে)
পিটার হ্যানলি

3

উইকি.ডাব্লুপিপিথন.অর্গ-এ একটি দুর্দান্ত নিবন্ধ রয়েছে যা শিরোনামের সাথে কাজ করছে । নিবন্ধে ডাব্লুএক্সউইজেডস (ডাব্লুএক্সআইমেজ), পিআইএল বা পাইথনম্যাগিক ব্যবহারের সম্ভাব্যতার কথা উল্লেখ করা হয়েছে। ব্যক্তিগতভাবে, আমি পিআইএল এবং ডাব্লুএক্সউজেড ব্যবহার করেছি এবং উভয়ই চিত্রের ম্যানিপুলেশনকে মোটামুটি সহজ করে তুলেছি।


3

আপনি পাইগামের সার্ফারি মডিউলটি ব্যবহার করতে পারেন । এই মডিউলে 3 ডি পিক্সেল অ্যারে রিটার্ন পদ্ধতি রয়েছে যা পিক্সেল 3 ডি (সারফেস) বলে। আমি নীচে ব্যবহার দেখিয়েছি:

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

আমি আশা করি সহায়ক হয়েছে। শেষ শব্দ: স্ক্রিনপিক্সের আজীবন স্ক্রিনটি লক করা আছে।


2

"sudo apt-get ইনস্টল পাইথন-ইমেজিং" কমান্ডটি ব্যবহার করে পিআইএল ইনস্টল করুন এবং নিম্নলিখিত প্রোগ্রামটি চালান। এটি চিত্রটির আরজিবি মান প্রিন্ট করবে। চিত্রটি বড় হলে '>' ব্যবহার করে কোনও ফাইলে আউটপুট পুনর্নির্দেশ করে তবে পরে আরজিবি মান দেখতে ফাইলটি খুলুন

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]

2

আপনি টিকিনটার মডিউলটি ব্যবহার করতে পারেন, এটি জি জিআইআই টুলকিটের মান পাইথন ইন্টারফেস এবং আপনার অতিরিক্ত ডাউনলোডের দরকার নেই। Https://docs.python.org/2/library/tkinter.html দেখুন ।

(পাইথন 3 এর জন্য, টিনকটারের নামকরণ টিঙ্কটারে করা হয়েছে)

আরজিবি মানগুলি কীভাবে সেট করবেন তা এখানে রয়েছে:

#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()

আরজিবি পান:

#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(" ")))

2
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

1
যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
নরেন্দ্র যাদব

1
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img=mpimg.imread('Cricket_ACT_official_logo.png')
imgplot = plt.imshow(img)

1

আপনি যদি কোনও আরজিবি রঙিন কোড আকারে তিনটি অঙ্কের সন্ধান করছেন তবে নিম্নলিখিত কোডটি ঠিক এটি করা উচিত।

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)

এটি আপনার পক্ষে কাজ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.