2016-02-23 51 views
5

Tôi có vài hình ảnh tỷ lệ xám và tôi đã tính toán giá trị pixel trung bình của tổng số hình ảnh, để tôi có thể biểu thị từng hình ảnh riêng lẻ bằng một giá trị duy nhất.Làm thế nào để có được một giá trị pixel trung bình của một hình ảnh tỷ lệ xám trong Python bằng cách sử dụng PIL Numpy?

enter image description here

+3

Bạn nhận được các kích thước của hình ảnh, lặp trên mỗi pixel, tổng giá trị của họ lên và sau đó chia ... nhưng tôi không biết tại sao bạn cần phải đi đến rắc rối như vậy chỉ để "đại diện cho mỗi hình ảnh cá nhân bằng cách sử dụng một singl giá trị điện tử "và nếu hai hình ảnh có cùng mức trung bình, bạn chỉ bị thất bại. Bạn có thể đưa thêm một số bối cảnh của vấn đề của bạn? Có lẽ là một cách tốt hơn. – gil

+0

Vâng, mang nó nói. Giả sử rằng bạn có 256 giá trị có thể cho mức trung bình, bạn gặp rắc rối với hơn 256 hình ảnh vì ít nhất hai giá trị sẽ có cùng mức trung bình. Và bạn có thể mong đợi va chạm cho hình ảnh ít hơn nhiều .... –

Trả lời

8

Nếu bạn muốn làm những thứ như thế này, bạn nên xem xét sử dụng scikit-image thay vì PIL sống hoặc gối. Hình ảnh SciKit sử dụng mảng có nhiều mảng cho hình ảnh, vì vậy tất cả các phương pháp gọn gàng đều hoạt động.

from skimage import io 
import numpy as np 

image = io.imread('http://i.stack.imgur.com/Y8UeF.jpg') 

print(np.mean(image)) 

Bạn có thể muốn chuyển đổi tất cả các hình ảnh nổi để có được một giá trị betwenn 01:

from skimage import io, img_as_float 
import numpy as np 

image = io.imread('http://i.stack.imgur.com/Y8UeF.jpg') 
image = img_as_float(image) 
print(np.mean(image)) 
2

Điều này có thể được thực hiện bằng PIL bởi Looping trên các điểm ảnh, tích lũy tất cả các giá trị pixel và chia bởi số lượng điểm ảnh (tức là chiều rộng * chiều cao)

from PIL import Image 

im = Image.open('theimagefile.jpg') 
im_grey = im.convert('LA') # convert to grayscale 
width,height = im.size 

total=0 
for i in range(0,width): 
    for j in range(0,height): 
     total += img.getpixel((i,j))[0] 

mean = total/(width * height) 
1

giải pháp là đơn giản hơn nhiều so với những người cung cấp trong các ý kiến ​​và câu trả lời - tức là, không có tính toán trên các bộ dữ liệu và không cần vòng lặp lồng nhau để lặp qua các giá trị ô.

đặc biệt, nếu bạn có một hình ảnh màu xám quy mô sau đó bạn có một mảng 2D trong đó các tế bào mảng được làm đầy với các giá trị vô hướng từ 0 đến 1.

Ngược lại, một hình ảnh màu sắc là một mảng 2D NumPy trong trong đó một số t2m rgb nằm trong mỗi ô.

nói một cách khác: một NumPy mảng đại diện của một hình ảnh màu xám quy mô là một mảng 2D mà tế bào có giá trị float giữa 0 (đen) và 1 (trắng)

được điều này, bạn có thể tính toán có nghĩa là giá trị pixel bằng cách tính toán giá trị trung bình dọc theo hai trục của mảng hình ảnh, như vậy:

>>> import numpy as NP 
>>> img = NP.random.rand(100, 100) 
>>> img[:5, :5] 
    array([[ 0.824, 0.864, 0.731, 0.57 , 0.127], 
      [ 0.307, 0.524, 0.637, 0.134, 0.877], 
      [ 0.343, 0.789, 0.758, 0.059, 0.374], 
      [ 0.693, 0.991, 0.458, 0.374, 0.738], 
      [ 0.237, 0.226, 0.869, 0.952, 0.948]]) 

dòng mã này sẽ làm những gì bạn muốn - tính toán giá trị trung bình hai lần, một lần cho mỗi trục trong mảng (không cần chỉ định trục cho cuộc gọi thứ hai tới có nghĩa là vì giá trị trả về từ cuộc gọi đầu tiên chỉ là một mảng 1D

>>> img.mean(axis=0).mean() 

    0.50000646872609511 

giá trị của 0,5 có vẻ chính xác vì các giá trị mảng được tạo ra bằng cách gọi NP.random.rand mà trả về giá trị lấy mẫu từ một phân bố đều trên half-open khoảng [0, 1)

>>> import matplotlib.pyplot as MPL 
>>> MPL.imshow(img, cmap=MPL.cm.gray, interpolation='nearest') 
>>> MPL.show() 

enter image description here

Các vấn đề liên quan