Tìm khí khổng trong hình ảnh kính hiển vi thực vật


26

Dưới đây là một câu hỏi cho các chuyên gia xử lý hình ảnh.

Tôi đang làm việc trên một vấn đề thị giác máy tính khó khăn. Nhiệm vụ là đếm các lỗ khí (được đánh dấu bên dưới) trong hình ảnh kính hiển vi DIC. Những hình ảnh này chống lại hầu hết các kỹ thuật xử lý hình ảnh hời hợt như các hoạt động hình thái và phát hiện cạnh. Nó cũng khác với các nhiệm vụ đếm tế bào khác.

Tôi đang sử dụng OpenCV. Kế hoạch của tôi là xem xét các tính năng hữu ích cho phân biệt đối xử về khí khổng.

  • Phân loại kết cấu
    • DCT (Phân tích miền biến đổi / tần số cosin rời rạc)
    • LBP (Mẫu nhị phân cục bộ)
  • HOG (Biểu đồ độ dốc định hướng)
  • Máy dò tính năng mạnh mẽ (tôi nghi ngờ)
    • Góc Harris
    • Sift, SURF, SAO, v.v.
  • Phân loại tầng Haar / tính năng Viola-Jones

Và có thể thiết kế một mô tả tính năng mới lạ. Bây giờ tôi đang bỏ qua việc lựa chọn một bộ phân loại.

Tôi đã bỏ lỡ những gì? Làm thế nào bạn sẽ giải quyết điều này? Giải pháp cho các vấn đề phát hiện đối tượng tương tự sẽ rất hữu ích.

Hình ảnh mẫu ở đây .

khí khổng

Sau bộ lọc thông dải: băng thông được lọc

Phát hiện cạnh Canny không hứa hẹn. Một số khu vực hình ảnh nằm ngoài tiêu điểm: phát hiện cạnh canny


1
Có lẽ thay vì cố gắng tìm kiếm khí khổng, bạn có thể cố gắng loại bỏ các dòng ma mị?
endolith

1
Bạn phải xử lý bao nhiêu hình ảnh? Nó cần nhanh như thế nào? Làm thế nào tự động nó phải được?
endolith

1
Nó không phải là rất nhanh. Chúng tôi đang xử lý theo thứ tự 1000 hình ảnh. Nó sẽ tự động - đổ hình ảnh vào một thư mục và đi.
Matt M.

Câu trả lời:


15

Xin lỗi tôi không biết OpenCV và đây là bước xử lý trước hơn là câu trả lời hoàn chỉnh:

Đầu tiên, bạn không muốn một máy dò cạnh. Một máy dò cạnh chuyển đổi các chuyển tiếp (như bóng tối này sang ánh sáng):

    _____ /

thành những đường vân (vạch sáng trên bóng tối) như thế này:

    ____ /

Nó thực hiện một sự khác biệt, nói cách khác.

Nhưng trong hình ảnh của bạn, có một ánh sáng chiếu xuống từ một hướng, cho chúng ta thấy sự nhẹ nhõm của bề mặt 3D. Chúng tôi coi đây là đường và cạnh, bởi vì chúng tôi thường thấy mọi thứ ở chế độ 3D, nhưng chúng không thực sự, đó là lý do tại sao máy dò cạnh không hoạt động và khớp mẫu sẽ không hoạt động dễ dàng với hình ảnh được xoay (hoàn hảo khớp ở 0 độ xoay thực sự sẽ hủy hoàn toàn ở 180 độ, vì ánh sáng và bóng tối sẽ thẳng hàng với nhau).

Nếu chiều cao của một trong những đường mazy này trông như thế này từ phía bên:

    ____ /

sau đó chức năng độ sáng khi được chiếu sáng từ một phía sẽ như thế này:

    ____ ∧v ____

Đây là những gì bạn nhìn thấy trong hình ảnh của bạn. Bề mặt trở nên sáng hơn và bề mặt dấu trở nên tối hơn. Vì vậy, bạn không muốn phân biệt. Bạn cần tích hợp hình ảnh theo hướng chiếu sáng, và nó sẽ cung cấp cho bạn bản đồ chiều cao ban đầu của bề mặt (xấp xỉ). Sau đó, sẽ dễ dàng hơn để khớp mọi thứ, cho dù thông qua biến đổi Hough hoặc khớp mẫu hoặc bất cứ điều gì.

Tôi không chắc chắn làm thế nào để tự động hóa việc tìm hướng chiếu sáng. Nếu nó giống nhau cho tất cả các hình ảnh của bạn, tuyệt vời. Nếu không, bạn phải tìm đường tương phản lớn nhất và giả sử ánh sáng vuông góc với nó hoặc một cái gì đó. Ví dụ của tôi, tôi xoay hình ảnh theo cách thủ công theo hướng tôi nghĩ là đúng hướng, với ánh sáng đến từ bên trái:

nguyên bản, xoay

Tuy nhiên, bạn cũng cần xóa tất cả các thay đổi tần số thấp trong hình ảnh, để chỉ làm nổi bật các tính năng giống như dòng thay đổi nhanh chóng. Để tránh các tạo tác đổ chuông, tôi đã sử dụng hiệu ứng làm mờ 2D Gaussian và sau đó trừ nó khỏi bản gốc:

lọc cao

Việc tích hợp (tổng tích lũy) có thể chạy trốn dễ dàng, tạo ra các vệt ngang. Tôi đã loại bỏ chúng bằng một đường chuyền cao Gaussian khác, nhưng chỉ theo hướng ngang lần này:

đầu ra

Bây giờ các lỗ khí có hình elip màu trắng xung quanh, thay vì màu trắng ở một số nơi và màu đen ở những nơi khác.

Nguyên:

nhập mô tả hình ảnh ở đây

Tích hợp:

nhập mô tả hình ảnh ở đây

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

Biến đổi Hough có thể được sử dụng để phát hiện các hình elip như thế này, được làm bằng "pixel cạnh", mặc dù nó thực sự tốn kém về tính toán và bộ nhớ, và chúng không phải là hình elip hoàn hảo nên nó phải là một bộ phát hiện "cẩu thả". Tôi chưa bao giờ thực hiện nó, nhưng có rất nhiều kết quả của Google cho " phát hiện hình elip ". Tôi muốn nói rằng nếu bạn phát hiện một hình elip bên trong cái kia, trong một không gian tìm kiếm có kích thước nhất định, nó sẽ được tính là một lỗ hổng.

Cũng thấy:


PS Có phải những gì tôi đã làm ở đây có một cái tên? Đây có phải là một loại bộ lọc phổ biến?
endolith

1
+1 - Câu trả lời tuyệt vời! Về tự động hóa góc nguồn sáng - bạn có thể sử dụng bộ dò cạnh tính toán cả độ lớn và độ dốc và sau đó tính trung bình trọng số (theo mag.) Của độ dốc. Các phản ứng mạnh nhất nên theo hướng chiếu sáng.
Andrey Rubshtein

11

Điều đầu tiên tôi sẽ thử là khớp mẫu, với các mẫu được xoay cho tất cả các góc với một số bước. Xoay mẫu cần thiết ở đây. Ngoài ra sự lựa chọn mẫu có thể không tầm thường - có thể là một số với ánh sáng khác nhau và nó có thể được làm mờ để cho phép sự khác biệt về hình dạng.

http://en.wikipedia.org/wiki/Template_matching#Template-basing_matching_and_convolution

Tiếp theo - HOG có vẻ đầy hứa hẹn ở đây. Một giải pháp khác có thể là sử dụng máy dò góc mạnh như Moravec hoặc Shi-Tomasi (với sự triệt tiêu không tối đa) và tìm kiếm các nhóm 2 góc hoặc 3-4 góc trên cùng một đường với các ứng cử viên. Sau khi tìm ứng viên, bạn có thể áp dụng đường viền tích cực để xác minh (không chắc nó có thực sự giúp ích không, nhưng đó là khả năng)

http://en.wikipedia.org/wiki/C Corner_detector

http://en.wikipedia.org/wiki/Active_contour

Tuy nhiên, một khả năng khác là sử dụng biến đổi Hough cho các hình elip, có thể không chỉ có 2 mà là 3-4 tham số miễn phí.


7

Câu trả lời một phần. Tìm ứng viên với Mathicala:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

nhập mô tả hình ảnh ở đây


Kết quả thú vị ... có thể kết hợp với một số chương trình khác ...
Matt M.

@MAtt Yep Tôi nghĩ rằng đã loại bỏ ít nhất 80% bề mặt không nhắm mục tiêu. Sau khi làm giãn mặt nạ một chút, bạn nên tìm kiếm các hình elip. Xem xét phương pháp bạn sử dụng (tôi vẫn đang nghĩ tôi có thể làm gì) giờ đây bạn đã biết những con thú đang bị bao vây.
Tiến sĩ belisarius

1

Tôi sẽ bắt đầu bằng cách sử dụng một bộ phát hiện cạnh nhạy (ví dụ cường độ dốc với ngưỡng thấp), và sau đó sử dụng biến đổi Hough để cố gắng tìm các hình elip. Canny vẫn có thể làm việc tốt. Tôi chắc chắn có những thông số bạn có thể điều chỉnh để làm cho nó nhạy hơn và chọn các cạnh bị mờ.

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.