5

Tôi có hình ảnh này:Loại bỏ ký tự không mong muốn trong một sơ đồ phân tử hữu cơ

enter image description here

Tôi muốn loại bỏ tất cả các phần của hình ảnh mà không tạo thành một phần của cấu trúc phân tử hữu cơ. Vì vậy, trong hình ảnh cụ thể này, tôi muốn xóa Process Aline below it. Tôi đã cố gắng sử dụng bwlabel để nhận các thành phần được kết nối nhưng bản thân cấu trúc không tạo thành một thành phần đơn lẻ. Như vậy, loại bỏ bằng phương pháp đó là không thể. Bất kỳ ý tưởng làm thế nào tôi có thể đi về vấn đề này?

+0

Câu hỏi có thể âm thanh ngu ngốc, nhưng sự khác biệt giữa các phần bạn muốn và các phần bạn không muốn là gì? Cả hai đều là dòng và ký tự. Có thể phát hiện khoảng cách thẳng đứng (sử dụng tổng hàng) và chia nhỏ ở đó? Có thể sử dụng imerode để kết nối cả hai khu vực màu đen, sau đó phân đoạn với bwlabel? – Daniel

Trả lời

8

Có hai cách bạn có thể tiếp cận điều này, tùy thuộc vào tùy chọn của bạn.

Phương pháp # 1 - Sử dụng bwareaopen

Một cách rẻ tiền để làm điều này sẽ được đảo ngược hình ảnh để các điểm ảnh đối tượng có màu trắng thay vì màu đen, sau đó thực hiện một đóng hình thái vào hình ảnh và loại bỏ những lĩnh vực mà rơi vào một số tiền nhất định. Việc đóng sẽ tham gia các vùng bị ngắt kết nối với nhau và lợi dụng việc tham gia "cấu trúc" sẽ tạo ra một khu vực có diện tích lớn, bạn có thể ngưỡng theo khu vực của mỗi khu vực và loại bỏ các khu vực đó dưới một mức nhất định.

Sau đó, bạn có thể lấy lại hình ảnh gốc bằng cách thực hiện một cách hợp lý AND với hình ảnh ngược và kết quả đã đóng, sau đó hoàn nguyên kết quả trung gian này. Hiệu quả của điều này sẽ là chúng tôi chỉ giữ các pixel thuộc về hình ảnh ban đầu do hoạt động đóng các pixel đối tượng tạo nhân tạo. Cụ thể, việc kết hợp các vùng lân cận của cấu trúc sẽ tạo các pixel đối tượng mới và do đó, việc thực hiện một AND sẽ đảm bảo rằng các pixel đó không giống với pixel gốc bị xóa. Vì điều này được thực hiện ở mặt sau của kết quả ban đầu, việc quay trở lại sẽ đưa bạn trở lại miền gốc của các pixel đối tượng là màu đen thay vì màu trắng.

Something như thế này:

%// Read in image from StackOverflow 
im = imread('http://i.stack.imgur.com/A7iT7.png'); 

%// Invert image 
im = ~im; 

%// Define 50 x 50 structuring element and close the image 
se = strel('square', 50); 
out = imclose(im, se); 

%// Remove regions whose areas fall below 10000 pixels 
out = bwareaopen(out, 10000); 

%// Remove out extraneous closing areas by ANDing with inverted image 
%// then reinvert to bring back to original label scheme 
out = ~(im & out); 

%// Show the image 
imshow(out); 

Chúng tôi nhận được hình ảnh này:

enter image description here

Ghi chú

  1. Chức năng imclose sẽ thực hiện việc đóng cửa hình thái cho bạn với một yếu tố cấu được xác định bởi strel. Tôi đã sử dụng một hình vuông 50 x 50 để đảm bảo rằng chúng ta có một cửa sổ đủ lớn để nối các pixel đối tượng lân cận lại với nhau.
  2. Chức năng bwareaopen chụp ảnh nhị phân và loại bỏ các khu vực có diện tích pixel nằm dưới một mức nhất định. Sau khi kết thúc, bạn sẽ có hai vùng được kết nối - phần đầu của hình ảnh với cấu trúc và phần cuối cùng với văn bản. Bằng cách thử nghiệm, 10.000 pixel đã xóa khu vực ở dưới cùng.

Phương pháp # 2 - Sử dụng regionprops

Liên quan đến Phương pháp # 1, một phương pháp khác để làm điều này và trở thành ngưỡng thuyết bất khả tri là để đi với ý tưởng ban đầu của bạn. Thực hiện thao tác đóng, nhưng sau đó đánh giá các vùng của từng vùng được kết nối và chọn vùng có diện tích lớn nhất. Những gì tôi đề nghị là sử dụng regionprops trong trường hợp đó, đó là một chức năng được thiết kế đặc biệt để phân tích đặc điểm của khu vực hình ảnh riêng biệt. Đầu ra sẽ là cấu trúc của các phần tử N, trong đó N là tổng số đối tượng duy nhất và được kết nối được tìm thấy trong hình ảnh và mỗi cấu trúc chứa các trường thuộc tính bạn muốn đo trong hình ảnh. Trong trường hợp của bạn, hãy chỉ định các thuộc tính 'Area''PixelIdxList' chứa các vị trí pixel và khu vực chính của từng khu vực.

Bạn sẽ tìm thấy tổng diện tích tối đa và sử dụng vị trí pixel tương ứng và đặt bản đồ đầu ra mà bạn muốn hợp lý AND bằng.

Something như thế này:

%// Read in image from StackOverflow 
im = imread('http://i.stack.imgur.com/A7iT7.png'); 

%// Invert image 
im = ~im; 

%// Define 50 x 50 structuring element and close the image 
se = strel('square', 50); 
out = imclose(im, se); 

s = regionprops(out, 'Area', 'PixelIdxList'); %// Apply regionprops 

%// Find the region with the max area 
[~,id] = max([s.Area]); 

%// Create an output mask with the largest area 
%// Make logical 
out = false(size(im)); 

%// Set pixels from largest area 
out(s(id).PixelIdxList) = true; 

%// Rest of the logic from before 
%// Remove out extraneous closing areas by ANDing with inverted image 
%// then reinvert to bring back to original label scheme 
out = ~(im & out); 

%// Show the image 
imshow(out); 

Bạn sẽ nhận được chính xác kết quả tương tự như phương pháp đầu tiên.

+0

Cảm ơn rất nhiều.Tôi vẫn có một câu hỏi.Bởi bwareapen bạn đang loại bỏ các khu vực có diện tích pixel dưới 1000. Có cách nào tôi có thể tìm thấy các khu vực pixel của mọi khu vực sau khi đóng hoạt động. Điều này là bởi vì trong hầu hết các trường hợp tôi yêu cầu chỉ có khu vực kết nối lớn nhất, vì vậy nếu tôi có thể nhận được các khu vực điểm ảnh của mỗi khu vực kết nối tôi chỉ có thể lấy một với diện tích lớn nhất – Noober

+1

Ah có bạn có thể. Hãy cho tôi một chút để sửa đổi câu trả lời của tôi. Thành thật mà nói, ý tưởng của bạn là một ý tưởng khác mà tôi đang cân nhắc nhưng tôi muốn giúp bạn có câu trả lời nhanh chóng. – rayryeng

+0

Trong thực tế, tôi đã thử sử dụng 'bwlabel' sau thao tác' đóng' để lấy thành phần được kết nối. Sử dụng thành phần được kết nối đầu tiên sau đó tôi nhận được ảnh gốc của mình bằng cách thực hiện logic 'AND'.It sẽ cho kết quả chính xác. Nhưng tôi không nghĩ rằng mọi thành phần đầu tiên sẽ là thành phần có diện tích lớn nhất. Đó là lý do tại sao tôi muốn lấy các vùng của mọi vùng – Noober

1

Sau khi giả định rằng danh hiệu hình ảnh được tách ra trong không gian từ "hình ảnh thực tế" đủ xa:

Thi công các đốm màu bằng cách làm mờ hình ảnh, tìm các thành phần kết nối, đi trên/lớn hơn một (hoặc một số dựa trên kinh nghiệm khác điều đó phụ thuộc vào dữ liệu của bạn). Vì vậy, trước khi sử dụng thuật toán thành phần được kết nối, hãy thực hiện tiền xử lý:

  1. Bộ lọc Gauss/Median (nếu cần) và phát hiện cạnh.
  2. binarization
  3. hoạt động hình thái (xói mòn, sự giãn nở)
  4. Blob Khai thác với công nghệ tự động (kích thước/hình/vị trí).

trong khi 4. là thay thế cho các thành phần được kết nối (không bắt buộc). Bạn có thể tìm kiếm các phương pháp khác theo từ khóa blob extraction hoặc text extraction. Đây là một phác thảo sơ lược về những gì bạn sẽ làm "trong trường hợp chung". Bước nào mang lại giải pháp tốt nhất là rất cao cho dữ liệu của bạn, vì vậy bạn sẽ phải thử nghiệm một chút.

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