Edit pixel values in an image as numpy array

numpy array to image
convert image to 2d array python
skimage image size
extract pixel values from image python
python image pixel manipulation
skimage to numpy array
pixel array python
numpy imread

I am reading an image like so:

img = np.array(Image.open(test_dir + image_name))

What I want to do is find a region in the array where the value is high (250 or more) and reduce it by 10:

rows = img.shape[0]
cols = img.shape[1]
pixel = []
for x in range(0,rows):
    for y in range(0, cols):
        if x >= 122 and x <= 160 and y >= 34  and y <= 71:
            if img[x,y]>= 250:
                img[x,y] = img[x,y] -10
                pixel.append(img[x,y])

So the region I am looking at according the the unaltered image should be a box from (122, 34) to (160,71), and it should have some pixels over 250, but somehow when I run this code I end up with nothing in the pixel list

Is img a 3 dimensional array? If so, then your test img[x, y] >= 250 is testing if an array of 3 elements is greater than 250. This will result in an error and cause your script to terminate at that point. You did not say if this is happening.

If it is a 3 dimensional array and you want to check if all channels have value greater than 250 at position x, y, then you have to check for np.all(img[x, y] >= 250) instead of img[x, y] >= 250.

In general you want to avoid loops and use vectorized operations to speed things up.

min_row = 122
max_row = 161
min_col = 34
max_col = 72
threshold = 250

row_slice = slice(min_row, max_row)
col_slice = slice(min_col, max_col)
roi = img[row_slice, col_slice] >= threshold
img[row_slice, col_slice][roi] -= 10

or more succinctly but less readable,

roi = img[min_row:max_row, min_col:max_col] >= threshold
img[min_row:max_row, min_col:max_col][roi] -= 10

python - Edit pixel values in an image as numpy array, Is img a 3 dimensional array? If so, then your test img[x, y] >= 250 is testing if an array of 3 elements is greater than 250. This will result in an error and cause  That is because the data is ordered by lines, then each line is ordered by pixels, and finally each pixel contains 3 byte values for RGB. Each colour is represented by an unsigned byte ( numpy type uint8 ). Now let’s fill the array with orange pixels (red=255, green=128, blue=0).

Provided your image is grayscale this will do it.

inds = np.where(img>=250)
inds = inds[(inds.T[0]>=122)&(inds.T[0]<=160)&(inds.T[1]>=34)&(inds.T[1]<=71)]
img[inds]-=10

A crash course on NumPy for images, NumPy arrays representing images can be of different integer or float NumPy indexing can be used both for looking at the pixel values and to modify them: Masks are very useful when you need to select a set of pixels on which to perform​  Image processing with Python, NumPy (read, process, save) By storing the images read by Pillow(PIL) as a NumPy array ndarray, various image processing can be performed using NumPy functions. By the operation of ndarray, acquisition and rewriting of pixel values, trimming by slice, concatenating can be done.

The simplest way is one line:

im[im>250]-=10

Demonstration

Start with this 8x8 gradient image:

Here it is enlarged:

Then use IPython like this:

# Load image as L (greyscale)
im = np.array(Image.open('image.png').convert('L'))

# View contents
im
Out[16]: 
array([[255, 255, 255, 255, 255, 255, 255, 255],
       [219, 219, 219, 219, 219, 219, 219, 219],
       [182, 182, 182, 182, 182, 182, 182, 182],
       [146, 146, 146, 146, 146, 146, 146, 146],
       [109, 109, 109, 109, 109, 109, 109, 109],
       [ 73,  73,  73,  73,  73,  73,  73,  73],
       [ 36,  36,  36,  36,  36,  36,  36,  36],
       [  0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)

# Do required processing
im[im>250]-=10

# Review contents
In [18]: im
Out[18]: 
array([[245, 245, 245, 245, 245, 245, 245, 245],
       [219, 219, 219, 219, 219, 219, 219, 219],
       [182, 182, 182, 182, 182, 182, 182, 182],
       [146, 146, 146, 146, 146, 146, 146, 146],
       [109, 109, 109, 109, 109, 109, 109, 109],
       [ 73,  73,  73,  73,  73,  73,  73,  73],
       [ 36,  36,  36,  36,  36,  36,  36,  36],
       [  0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)

Let's try decreasing even more pixels, just for fun:

In [19]: im[im>100]-=10

In [20]: im
Out[20]: 
array([[235, 235, 235, 235, 235, 235, 235, 235],
       [209, 209, 209, 209, 209, 209, 209, 209],
       [172, 172, 172, 172, 172, 172, 172, 172],
       [136, 136, 136, 136, 136, 136, 136, 136],
       [ 99,  99,  99,  99,  99,  99,  99,  99],
       [ 73,  73,  73,  73,  73,  73,  73,  73],
       [ 36,  36,  36,  36,  36,  36,  36,  36],
       [  0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)

2.6. Image manipulation and processing using Numpy and Scipy , Here, image == Numpy array np.array Creating a numpy array from an image file: >>> Local filters: replace the value of pixels by a function of the values of  from PIL import Image import numpy as np. Here, we have imported Image Class from PIL Module and Numpy Module as np. Now, let’s have a look at the creation of an array. w,h=512,512 # Declared the Width and Height of an Image t=(h,w,3) # To store pixels # Creation of Array A=np.zeros(t,dtype=np.uint8) # Creates all Zeros Datatype Unsigned

For a more compact solution you can try

roi = img[122:161, 34:72]
pixel = roi[roi >= 250]
roi[roi >= 250] -= 10

Image processing with numpy, RGB images are usually stored as 3 dimensional arrays of 8-bit unsigned PIL import Image array = np.zeros([100, 200], dtype=np.uint8) # Set grey value to  Numpy change all elements on condition on multidimensional array Tag: python , image-processing , numpy , scipy I want to change elements to be [0,0,0] if the pixel at that color is blue.

Importing Image Data into NumPy Arrays, Once you set up the packages, you can easily install Pillow using pip . print(​data) gives the value of each pixel of the NumPy array image. I have a basic image, in color. I would like to change every color by another color. I know the functions putpixel, et caetera. My problem, it is that I do not know how to separate, to indicate every "zone" of color. For example: transform all the green pixels into another color, all the red in an other one, et caetera.

Image processing with Python, NumPy (read, process, save), By storing the images read by Pillow(PIL) as a NumPy array ndarray, By the operation of ndarray, acquisition and rewriting of pixel values,  Display the image array using matplotlib. Change the interpolation method and zoom to see the difference. Transform your image to greyscale; Increase the contrast of the image by changing its minimum and maximum values. Optional: use scipy.stats.scoreatpercentile (read the docstring!) to saturate 5% of the darkest pixels and 5% of the lightest

Pil image from array type, 4 thoughts on “ How to convert between NumPy array and PIL Image The intensity values for input image of class single or double must be in the range [0, 1]. When you change the pixel data, it is Consider the object 'train_x' is a numpy  Convert A Numpy Array To Opencv Image. Convert A Numpy Array To Opencv Image

Comments
  • Neither roi or pixel are used in the final line... Please review.
  • @Benjamin Actually, I just looked at this more carefully and, you are correct, the first 2 lines are not needed, but... the final line works on its own as it is the same as my answer which I demonstrated to work in my answer.
  • @Benjamin You are right about roi, I've fixed that, thanks. As for, the second line, it isn't explicitly asked but the code in the original question also extracts the values of the pixels in the variable pixel
  • @MarkSetchell The first line is actually needed since the OP just wants to search within a certain area.
  • There has been an edit here that makes my comment ambiguous... and pixel is still not being used.