Làm cách nào để thay thế giá trị NaN cho dữ liệu hình ảnh?


8

Tập dữ liệu của tôi có tổng cộng 200 cột, trong đó mỗi cột tương ứng với cùng một pixel trong tất cả các hình ảnh của tôi. Tổng cộng, tôi có 48.500 hàng. Các nhãn cho phạm vi dữ liệu từ 0-9.

Dữ liệu trông giống như thế này:

raw_0   raw_1   raw_2   raw_3   raw_4
0   120.0   133.0   96.0    155.0   66.0
1   159.0   167.0   163.0   185.0   160.0
2   45.0    239.0   66.0    252.0   NaN
3   126.0   239.0   137.0   NaN 120.0
4   226.0   222.0   153.0   235.0   171.0
5   169.0   81.0    100.0   44.0    104.0
6   154.0   145.0   76.0    134.0   175.0
7   77.0    35.0    105.0   108.0   112.0
8   104.0   55.0    113.0   90.0    107.0
9   97.0    253.0   255.0   251.0   141.0
10  224.0   227.0   84.0    214.0   57.0
11  NaN 13.0    51.0    50.0    NaN
12  82.0    213.0   61.0    98.0    59.0
13  NaN 40.0    84.0    7.0 39.0
14  129.0   103.0   65.0    159.0   NaN
15  123.0   128.0   116.0   198.0   111.0

Mỗi cột có khoảng 5% giá trị bị thiếu và tôi muốn điền vào các giá trị NaN này một cái gì đó có ý nghĩa. Tuy nhiên, tôi không chắc chắn làm thế nào để đi về điều này. Bất kỳ đề nghị sẽ được hoan nghênh.

Cảm ơn bạn!

Câu trả lời:


8

Nếu bạn có hình ảnh được kéo dài dưới dạng cột trong một bảng có ~ 48.500 hàng, tôi giả sử bạn có hình ảnh thô có kích thước 220x220.

Bạn có thể sử dụng một chức năng có sẵn thông qua OpenCV được gọi inpaint, nó sẽ khôi phục các giá trị pixel bị thiếu (ví dụ: các pixel đen của ảnh bị xuống cấp).

Dưới đây là một ví dụ hình ảnh. Trên cùng bên trái hiển thị hình ảnh với các giá trị bị thiếu (màu đen). Trên cùng bên phải chỉ hiển thị các giá trị còn thiếu (mặt nạ). Dưới cùng bên trái và dưới cùng bên phải là đầu ra cuối cùng, so sánh hai thuật toán khác nhau để điền vào hình ảnh.

khôi phục lại hình ảnh

Tôi sẽ đề nghị thử cả hai phương pháp trên hình ảnh của bạn để xem cái gì trông đẹp nhất.

Hãy xem Tài liệu để biết thêm chi tiết về các thuật toán. Dưới đây là tài liệu của chức năng thực tế .

Đối với mã, nó sẽ trông giống như thế này:

import opencv as cv    # you will need to install OpenCV

dst = cv.inpaint(img, mask, 3, cv.INPAINT_TELEA)
  • đối số đầu tiên là hình ảnh của bạn với các giá trị bị thiếu
  • thứ hai là mặt nạ, với các vị trí thiếu pixel, tức là các pixel nên được điền / nội suy.
  • thứ ba là bán kính xung quanh các pixel bị thiếu để lấp đầy
  • thứ tư là cờ cho thuật toán sử dụng (xem liên kết ở trên để biết hai phương án)

Đối với mỗi hình ảnh, bạn có thể tạo mặt nạ với một cái gì đó như thế này:

mask = image[image == np.nan]

Cảm ơn vì những đề suất của bạn! Trông đầy hứa hẹn.
Amer Farooq

2

Có nhiều cách để đi sau này. Bạn có thể thực hiện nghĩa là cắt cụt, cắt cụt trung bình, cắt ngang chế độ hoặc cắt cụt giá trị phổ biến nhất. Tính toán một trong các giá trị trên cho các hàng hoặc cột tùy thuộc vào cách dữ liệu của bạn được cấu trúc. Một trong những cách đơn giản nhất để lấp đầy Nan là df.fillnatrong gấu trúc


2

với bất kỳ (x, y) nếu NAN, bạn có thể tính trung bình các pixel xung quanh là:

if((x==0  & y==0):
 return (x+1)+(y+1))/2 

else if(x==x_max & y==y_max):
 return (x-1)+(y-1))/2

else if(x==0 & y==y_max):
 return (x+1)+(y-1))/2

else if(x==x_max & y==0):
 return (x-1)+(y+1))/2

else if(x==0):
 return ((x+1)+(y-1)+(y+1))/3

else if(x==x_max):
 return ((x-1)+(y-1)+(y+1))/3

else if(y==0):
 return ((x+1)+(x-1)+(y+1))/3

else if(y==y_max):
 return ((x-1)+(x+1)+(y-1))/3

else :
  return  ((x-1)+(x+1)+(y-1)+(y+1))/4 

1

Nếu các hàng liền kề là các pixel liền kề mà tôi chỉ sử dụng giá trị trung bình của các pixel liền kề. Điều đó có vẻ như nó có ý nghĩa đối với một hình ảnh, và chắc chắn sẽ khó có thể nhìn thấy bằng mắt người.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.