Tìm các vùng / mẫu đối xứng trong ảnh


14

Tôi có một bộ ảnh đại diện cho độ cong trung bình của bề mặt lưng của con người.

Những gì tôi muốn làm là "quét" hình ảnh cho các điểm có "đối trọng" tương tự, được phản ánh trong một số phần khác của hình ảnh (rất có thể đối xứng với đường giữa, nhưng không nhất thiết vì có thể có biến dạng). Một số kỹ thuật ghép ảnh sử dụng điều này để "tự động phát hiện" các điểm tương tự giữa các hình ảnh, nhưng tôi muốn phát hiện chúng cho cả hai mặt của cùng một hình ảnh.

Mục tiêu cuối cùng là tìm ra một đường dọc, liên tục, có lẽ là cong nhất, có thể phân chia một cách thích ứng phần lưng theo "nửa" đối xứng.

Một hình ảnh mẫu được đặt bên dưới. Lưu ý rằng không phải tất cả các vùng đều đối xứng (cụ thể, ngay phía trên trung tâm của hình ảnh, "dải" dọc màu đỏ lệch sang phải). Vùng đó sẽ nhận được điểm kém, hoặc bất cứ điều gì, nhưng sau đó đối xứng cục bộ sẽ được xác định từ các điểm đối xứng được đặt xa hơn. Trong mọi trường hợp, tôi sẽ phải điều chỉnh bất kỳ đại số nào cho miền ứng dụng của mình, nhưng điều tôi theo đuổi là chiến lược tương quan / kết hợp / mô hình phù hợp với som, tôi nghĩ phải có một cái gì đó xung quanh.

(EDIT: có nhiều hình ảnh bên dưới và một số giải thích thêm)

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

EDIT: theo yêu cầu, tôi sẽ bao gồm các hình ảnh tiêu biểu hơn, hoạt động tốt và có vấn đề. Nhưng thay vì hình ảnh được tô màu, chúng là hình ảnh thang độ xám, do đó màu sắc liên quan trực tiếp đến cường độ dữ liệu, điều không xảy ra với hình ảnh màu (chỉ cung cấp cho giao tiếp). Mặc dù hình ảnh màu xám dường như thiếu độ tương phản so với màu, nhưng độ dốc dữ liệu ở đó và có thể được đưa ra với một số độ tương phản thích ứng nếu muốn.


1) Hình ảnh của một chủ đề rất đối xứng:

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


2) Hình ảnh của cùng một chủ đề tại một thời điểm khác nhau. Mặc dù có nhiều "tính năng" hơn (nhiều độ dốc hơn), nhưng nó không "cảm thấy" đối xứng như trước:

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


3) Một đối tượng trẻ mỏng, có lồi (lồi xương, biểu thị bằng các vùng nhẹ hơn) ở đường giữa thay vì đường giữa lõm phổ biến hơn:

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


4) Một người trẻ bị lệch cột sống được xác nhận bởi X-Ray (lưu ý sự không đối xứng):

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


5) Đối tượng "nghiêng" điển hình (mặc dù chủ yếu là đối xứng xung quanh đường giữa cong và do đó không bị "biến dạng" đúng cách):

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


Bất kỳ trợ giúp đều được chào đón!


Tại sao không chỉ sử dụng cột sống làm dải phân cách?
Jim Clay

@JimClay: Tôi nghi ngờ cột sống là phần được đo, liên quan đến trục đối xứng thực tế của phần còn lại của hình ảnh
endolith

"Một số kỹ thuật ghép ảnh sử dụng điều này để" tự động phát hiện "các điểm tương tự giữa các hình ảnh" Tạo một bản sao lật của hình ảnh và sau đó sử dụng một trong những điểm đó. :)
endolith

Bạn không thể đơn giản phản chiếu hình ảnh dọc theo trục Y và sử dụng thuật toán đăng ký? Bởi vì đã có rất nhiều nghiên cứu về các thuật toán đăng ký linh hoạt / không theo quy tắc mà bạn có thể xây dựng dựa trên.
Niki Estner

JimClay, cột sống là thứ tôi muốn tìm, tôi không biết nó ở đâu; Endolith, câu hỏi của tôi liên quan đến việc mọi người cho tôi biết tên của một số thuật toán đó, tôi chưa tìm thấy bất kỳ thuật toán nào. Và Nikie, đó là toàn bộ vấn đề, nhưng tôi không BIẾT bất kỳ thuật toán nào trong số đó, đó là lý do tại sao tôi đặt câu hỏi ngay từ đầu: o)
heltonbiker

Câu trả lời:


9

Như tôi đã nói trong các bình luận, đăng ký hình ảnh y tế là một chủ đề có rất nhiều nghiên cứu có sẵn, và tôi không phải là một chuyên gia. Từ những gì tôi đã đọc, ý tưởng cơ bản thường được sử dụng là xác định ánh xạ giữa hai hình ảnh (trong trường hợp của bạn là hình ảnh và hình ảnh phản chiếu của nó), sau đó xác định thuật ngữ năng lượng cho độ mịn và độ tương tự hình ảnh nếu áp dụng ánh xạ và cuối cùng tối ưu hóa ánh xạ này bằng cách sử dụng các kỹ thuật tối ưu hóa tiêu chuẩn (hoặc đôi khi dành riêng cho ứng dụng).

Tôi đã hack cùng một thuật toán nhanh trong Mathematica để chứng minh điều này. Đây không phải là một thuật toán bạn nên sử dụng trong một ứng dụng y tế, chỉ là một minh chứng cho những ý tưởng cơ bản.

Đầu tiên, tôi tải hình ảnh của bạn, phản chiếu nó và chia những hình ảnh này thành các khối nhỏ:

src = ColorConvert[Import["http://i.stack.imgur.com/jf709.jpg"], 
   "Grayscale"];
mirror = ImageReflect[src, Left -> Right];
blockSize = 30;
partsS = ImagePartition[src, {blockSize, blockSize}];
partsM = ImagePartition[mirror, {blockSize, blockSize}];
GraphicsGrid[partsS]

Đồ họa toán học

Thông thường, chúng tôi sẽ thực hiện đăng ký cứng nhắc gần đúng (sử dụng ví dụ: điểm chính hoặc khoảnh khắc hình ảnh), nhưng hình ảnh của bạn gần như được căn giữa, vì vậy tôi sẽ bỏ qua điều này.

Nếu chúng ta nhìn vào một khối và đó là bản sao hình ảnh phản chiếu:

{partsS[[6, 10]], partsM[[6, 10]]}

Đồ họa toán học

Chúng ta có thể thấy rằng chúng tương tự nhau, nhưng đã thay đổi. Số lượng và hướng của sự thay đổi là những gì chúng tôi đang cố gắng tìm hiểu.

Để định lượng độ tương tự của trận đấu, tôi có thể sử dụng khoảng cách euclide bình phương:

ListPlot3D[
  ImageData[
   ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
    SquaredEuclideanDistance]]]

Đồ họa toán học

thật đáng buồn, sử dụng dữ liệu này là tối ưu hóa trực tiếp khó hơn tôi nghĩ, vì vậy tôi đã sử dụng xấp xỉ bậc 2 thay thế:

fitTerms = {1, x, x^2, y, y^2, x*y};

fit = Fit[
   Flatten[MapIndexed[{#2[[1]] - blockSize/2, #2[[2]] - 
        blockSize/2, #1} &, 
     ImageData[
      ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
       SquaredEuclideanDistance]], {2}], 1], fitTerms, {x, y}];

Plot3D[fit, {x, -25, 25}, {y, -25, 25}]

Đồ họa toán học

Hàm này không giống như hàm tương quan thực tế, nhưng nó đủ gần cho bước đầu tiên. Hãy tính toán điều này cho mỗi cặp khối:

distancesFit = MapThread[
   Function[{part, template},
    Fit[Flatten[
      MapIndexed[{#2[[2]] - blockSize/2, #2[[1]] - blockSize/2, #1} &,
        ImageData[
        ImageCorrelate[part, template, 
         SquaredEuclideanDistance]], {2}], 1], 
     fitTerms, {x, y}]], {partsM, partsS}, 2];

Điều này cho chúng tôi thuật ngữ năng lượng đầu tiên của chúng tôi để tối ưu hóa:

variablesX = Array[dx, Dimensions[partsS]];
variablesY = Array[dy, Dimensions[partsS]];

matchEnergyFit = 
  Total[MapThread[#1 /. {x -> #2, y -> #3} &, {distancesFit, 
     variablesX, variablesY}, 2], 3];

variablesX/Ychứa các độ lệch cho mỗi khối và matchEnergyFitxấp xỉ mức chênh lệch euclide bình phương giữa ảnh gốc và ảnh được nhân đôi với các độ lệch được áp dụng.

Tối ưu hóa năng lượng này một mình sẽ cho kết quả kém (nếu nó hội tụ hoàn toàn). Chúng tôi cũng muốn các độ lệch được trơn tru, trong đó độ tương tự khối không nói gì về phần bù (ví dụ: dọc theo một đường thẳng hoặc trong nền trắng).

Vì vậy, chúng tôi thiết lập một thuật ngữ năng lượng thứ hai cho sự trơn tru:

smoothnessEnergy = Total[Flatten[
    {
     Table[
      variablesX[[i, j - 1]] - 2 variablesX[[i, j]] + 
       variablesX[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesX[[i - 1, j]] - 2 variablesX[[i, j]] + 
       variablesX[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}],
     Table[
      variablesY[[i, j - 1]] - 2 variablesY[[i, j]] + 
       variablesY[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesY[[i - 1, j]] - 2 variablesY[[i, j]] + 
       variablesY[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}]
     }^2]];

May mắn thay, tối ưu hóa bị ràng buộc được tích hợp sẵn trong Mathematica:

allVariables = Flatten[{variablesX, variablesY}];
constraints = -blockSize/3. < # < blockSize/3. & /@ allVariables;
initialValues = {#, 0} & /@ allVariables;
solution = 
  FindMinimum[{matchEnergyFit + 0.1 smoothnessEnergy, constraints}, 
   initialValues];

Hãy nhìn vào kết quả:

grid = Table[{(j - 0.5)*blockSize - dx[i, j], (i - 0.5)*blockSize - 
      dy[i, j]}, {i, Length[partsS]}, {j, Length[partsS[[1]]]}] /. 
   solution[[2]];
Show[src, Graphics[
  {Red,
   Line /@ grid,
   Line /@ Transpose[grid]
   }]]

Đồ họa toán học

Các 0.1yếu tố trước khi smoothnessEnergylà trọng lượng tương đối năng lượng êm ái được liên quan đến thuật ngữ hình ảnh trận đấu năng lượng. Đây là kết quả cho các trọng lượng khác nhau:

Đồ họa toán học

Những cải tiến có thể có:

  • Như tôi đã nói, thực hiện đăng ký cứng nhắc đầu tiên. Với nền trắng, đăng ký dựa trên khoảnh khắc hình ảnh đơn giản sẽ hoạt động tốt.
  • Đây chỉ là một bước. Bạn có thể sử dụng các offset bạn tìm thấy trong một bước và cải thiện chúng trong bước thứ hai, có thể với cửa sổ tìm kiếm nhỏ hơn hoặc kích thước khối nhỏ hơn
  • Tôi đã đọc các bài báo nơi họ làm điều này mà không có khối nào cả, nhưng tối ưu hóa bù cho mỗi pixel.
  • Hãy thử các chức năng làm mịn khác nhau

Trả lời quá dài để đọc chỉ để cho vui, nhưng hình ảnh cuối cùng khá đẹp: trông thật tuyệt vời: D
penelope

Câu trả lời này rất giác ngộ. Tôi sẽ cần một chút thời gian để nuốt nó, nhưng rất có thể là kỹ thuật đăng ký không cứng nhắc là những gì tôi cần sử dụng. May mắn thay, bạn đã cung cấp một số chi tiết về khái niệm, vì vậy trong trường hợp xấu nhất tôi có thể tìm ra một số cách tiếp cận tương tự. Trong khi đó, tôi sẽ cập nhật câu hỏi với nhiều hình ảnh hơn. Cảm ơn ngay bây giờ!
heltonbiker

4

Câu hỏi thú vị. Đầu tiên, có thể bạn theo đuổi các phương pháp tiếp cận dựa trên trình phát hiện điểm quan tâm và kết hợp. Điều này sẽ bao gồm SIFT (Biến đổi tính năng bất biến tỷ lệ), SURF, ORB, v.v ... hoặc thậm chí là một cách tiếp cận đơn giản hơn chỉ dựa trên toán tử Harris (csce.uark.edu/~jgauch/l Library / Features / Harris.1988.pdf ). Không rõ từ bài viết của bạn những gì bạn đã cố gắng, vì vậy tôi xin lỗi nếu tôi ngây thơ ở đây.

Nói rằng, hãy để tôi thực hiện một cách tiếp cận đơn giản hơn với Hình thái toán học (MM) chỉ để giải trí :) Hình ảnh để trực quan hóa tất cả các bước ở cuối.

Tôi đã lấy hình ảnh mẫu của bạn và chuyển đổi nó sang không gian màu L a b * bằng ImageMagick và chỉ sử dụng băng tần L *:

convert x.jpg -colorspace Lab -separate %d.png

0.png tương ứng với băng L *. Bây giờ, tôi chắc chắn rằng bạn có dữ liệu hình ảnh thực tế, nhưng tôi đang xử lý các tạo phẩm nén jpg và những gì không. Để xử lý một phần vấn đề này, tôi đã thực hiện mở hình thái theo sau là đóng hình thái với một đĩa phẳng có bán kính 5. Đây là cách cơ bản để giảm nhiễu với MM và cho bán kính đĩa không thay đổi nhiều hình ảnh. Tiếp theo ý tưởng của tôi dựa trên hình ảnh duy nhất này, có khả năng thất bại lớn cho các trường hợp khác. Vùng quan tâm của bạn được phân biệt trực quan bằng cách tối hơn ("nóng hơn" trong hình ảnh màu của bạn), vì vậy tôi cho rằng một bộ tạo nhị phân dựa trên thống kê có thể hoạt động tốt. Tôi đã sử dụng phương pháp của Otsu, một phương pháp tự động.

Tại thời điểm này, có thể hình dung rõ ràng khu vực trung tâm quan tâm. Vấn đề là, theo cách tiếp cận của tôi, tôi muốn nó là một thành phần khép kín nhưng không phải vậy. Tôi bắt đầu bằng cách loại bỏ mọi thành phần được kết nối nhỏ hơn thành phần lớn nhất (không tính nền là một trong số chúng). Điều này có cơ hội lớn hơn để làm việc trong các trường hợp khác nếu kết quả nhị phân là một kết quả tốt. Trong hình ảnh ví dụ của bạn, có một thành phần được kết nối với nền, vì vậy nó không bị loại bỏ nhưng nó không gây ra vấn đề.

Nếu bạn vẫn theo dõi tôi, chúng tôi vẫn chưa tìm thấy khu vực trung tâm được cho là thực sự quan tâm. Tôi đã bắt nó ở đây. Bất kể người đó cong như thế nào (thực ra tôi có thể thấy một số trường hợp có vấn đề nhất định), khu vực này giống như một đường thẳng đứng. Cuối cùng, tôi đơn giản hóa hình ảnh hiện tại bằng cách thực hiện mở hình thái với một hàng dọc có chiều dài 100. Độ dài này hoàn toàn tùy ý, nếu bạn không có vấn đề mở rộng thì đây không phải là một giá trị khó xác định. Bây giờ chúng tôi lại loại bỏ các thành phần, nhưng tôi đã cẩn thận hơn một chút ở bước này. Tôi đã sử dụng mở theo khu vực với phần bổ sung của hình ảnh để loại bỏ những gì tôi coi là các vùng nhỏ, điều này có thể được thực hiện theo cách được kiểm soát nhiều hơn bằng cách thực hiện một cái gì đó dưới dạng phân tích hạt (từ MM cũng vậy).

Bây giờ chúng ta có ba phần: phần bên trái của hình ảnh, phần trung tâm và phần bên phải của hình ảnh. Phần trung tâm dự kiến ​​sẽ là thành phần nhỏ hơn trong ba phần, vì vậy nó thu được một cách tầm thường.

Đây là kết quả cuối cùng, hình ảnh dưới cùng bên phải chỉ là hình ảnh chồng lên bên trái với hình ảnh gốc. Các số liệu cá nhân không phải là tất cả phù hợp, xin lỗi cho sự vội vàng.

http://i.imgur.com/XRhYv.png


Cảm ơn bạn rất nhiều vì sự quan tâm của bạn, nhưng cách tiếp cận của bạn nên xem xét một số tính chất nhất định của dữ liệu của tôi (không phải là khiếu nại, chỉ là chi tiết): 1) Dữ liệu thực tế là một mảng nổi 2D, được tô màu đỏ-vàng khác nhau- colormap xanh trong matplotlib của Python. Tôi không nghĩ làm việc với dữ liệu màu sẽ đúng về mặt khái niệm, hình ảnh chỉ được hiển thị cho mục đích giao tiếp; 2) Dữ liệu thực tế liên quan đến độ cong bề mặt (lồi so với lõm), với các phần màu đỏ là lõm và phần màu xanh lá cây là lồi. Trục đối xứng không nhất thiết phải rơi vào vùng lõm.
heltonbiker

Tôi sẽ sớm bổ sung thêm một số hình ảnh (và thay thế hình ảnh này) bằng hình ảnh thang độ xám, để bản thân hình ảnh có thể được sử dụng để thử nghiệm, loại bỏ nguy cơ biến dạng dải động do màu sắc.
heltonbiker

Các dữ liệu không có sẵn, không may. Các hình ảnh thang độ xám gần như là một xấp xỉ của nó.
mmgp

Tôi tin rằng gần đúng nhất có lẽ là đủ, nhưng tôi không ngại cung cấp dữ liệu thực tế. Tôi có thể đăng một số liên kết tải xuống DropBox công khai, chỉ không biết ở định dạng tệp nào.
heltonbiker
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.