8

Tôi đã sử dụng scikit-image để phân loại các tính năng của đường với một số thành công. Xem bên dưới: image processed by scikit-image. Tôi gặp khó khăn khi thực hiện bước tiếp theo là phân loại các tính năng. Ví dụ: giả sử các tính năng này nằm trong hộp (600, 800) và (1400, 600).Trích xuất các thuộc tính từ hình ảnh bằng cách sử dụng Scikit-image

Mã Tôi đang sử dụng để trích xuất các thông tin là:

from skimage import io, segmentation as seg 
color_image = io.imread(img) 
plt.rcParams['image.cmap'] = 'spectral' 
labels = seg.slic(color_image, n_segments=6, compactness=4) 

Mục tiêu là để có một bảng theo hình thức sau:

Image, feature_type, starting_pixel, ending_pixel 
001 a    (600, 600),  (1300, 700) 
002 b    (600, 600),  (1100, 700) 
002 undefined  (700, 700),  (900, 800) 

feature_type sẽ được dựa trên màu sắc, lý tưởng vai sẽ là một màu, cây và bàn chải sẽ là một màu khác, v.v.

Làm cách nào để trích xuất dữ liệu tôi cần? (ví dụ: có scikit phá vỡ hình ảnh thành các thành phần khác nhau, nơi tôi biết vị trí của mỗi thành phần. Sau đó tôi có thể vượt qua từng thành phần để một phân loại mà sẽ xác định những gì mỗi thành phần) Cảm ơn!

+1

câu hỏi của bạn có vẻ mơ hồ. Bạn có muốn tìm hộp giới hạn cho từng khu vực tính năng không? nếu có, bạn có muốn chúng trùng lặp hoặc không chồng lấp không? Bạn có muốn ánh xạ bản đồ tính năng lên lưới thường xuyên được lấy mẫu không? bạn có thể làm rõ? – fireant

+0

@fireant mục tiêu cuối cùng cho dù tôi làm điều đó trên toàn bộ hình ảnh hoặc trên một hộp giới hạn nhỏ là để xác định các tính năng dựa trên "màu sắc". Vì vậy, đường sẽ là (1), vai (2), mương 3), cây (4), v.v. – dassouki

+1

Nhưng tại sao bạn không chỉ cắt hình ảnh hoặc phân loại? Scikit Image hoạt động với ndarray, bạn có thể làm "color_image [600: 800,1400: 1600 ,:]". Tôi đang giải thích điều này một cách tồi tệ? – armatita

Trả lời

1

Đây là lần đầu tiên tôi thử mà gói .. tôi đã cố gắng với một hình ảnh đơn giản và tôi nhận được ít nhiều kết quả ngay:

smallimg.jpg

from skimage import io, segmentation as seg 
import matplotlib as plt 
import numpy as np 
color_image = io.imread('smallimg.jpg') 
labels = seg.slic(color_image, n_segments=4, compactness=4) 
for section in np.unique(labels): 
    rows, cols = np.where(labels == section) 
    print("Image="+str(section)) 
    print("Top-Left pixel = {},{}".format(min(rows), min(cols))) 
    print("Bottom-Right pixel = {},{}".format(max(rows), max(cols))) 
    print("---") 

Output:

Image=0 
Top-Left pixel = 3,1 
Bottom-Right pixel = 15,18 
--- 
Image=1 
Top-Left pixel = 26,1 
Bottom-Right pixel = 34,18 
--- 
Image=2 
Top-Left pixel = 43,1 
Bottom-Right pixel = 52,16 
--- 
Image=3 
Top-Left pixel = 0,0 
Bottom-Right pixel = 59,19 
--- 

Lưu ý rằng điểm ảnh ngoài cùng bên phải không chính xác như ý tôi vì độ dốc. Đoạn cuối cùng là nền trắng.

Tôi đã thử với hình ảnh của bạn nhưng tôi nghĩ bạn sẽ phải có được phân đoạn đúng. Tôi sẽ sử dụng n_segments = 7 nếu bạn muốn nhận được 6 hình ảnh + nền.

Tôi cũng thấy trong tài liệu về độ nhỏ gọn: "Thông số này phụ thuộc mạnh vào độ tương phản hình ảnh và hình dạng đối tượng trong hình ảnh". Vì vậy, những gì bạn muốn có thể khó đạt được.

Nếu bạn đang vẽ sáu hình ảnh trên hình ảnh bạn hiển thị ở trên, tại sao bạn không nhận được các tọa độ đó khi bạn vẽ hình ảnh thay vì áp dụng phân đoạn cho kết quả cuối cùng?

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