การค้นหาภูมิภาค / รูปแบบสมมาตรในภาพ


14

ฉันมีชุดของรูปภาพที่แสดงถึงความโค้งเฉลี่ยของพื้นผิวด้านหลังของมนุษย์

สิ่งที่ฉันต้องการทำคือ "สแกน" ภาพเพื่อหาจุดที่มีภาพคล้ายกัน "สะท้อน" ในส่วนอื่น ๆ ของภาพ (ส่วนใหญ่มีความสมมาตรกับเส้นกึ่งกลาง แต่ไม่จำเป็นเนื่องจากอาจมีความผิดปกติ) เทคนิคการเย็บภาพบางอย่างใช้สิ่งนี้เพื่อ "ตรวจจับอัตโนมัติ" จุดที่คล้ายกันระหว่างภาพ แต่ฉันต้องการตรวจจับทั้งสองด้านของภาพเดียวกัน

เป้าหมายสูงสุดคือการค้นหาเส้นต่อเนื่องตามแนวโค้งที่ยาวที่สุดและยาวที่สุดซึ่งแบ่งส่วนหลังในลักษณะสมมาตร "ครึ่ง"

ภาพตัวอย่างวางไว้ด้านล่าง โปรดสังเกตว่าไม่ใช่ทุกภูมิภาคที่มีความสมมาตร (เฉพาะด้านบนตรงกลางของภาพ "แถบ" แนวตั้งสีแดงเบี่ยงเบนไปทางขวา) ภูมิภาคนั้นควรได้รับคะแนนที่ไม่ดีหรืออะไรก็ตาม แต่จากนั้นสมมาตรในท้องถิ่นจะถูกกำหนดจากจุดสมมาตรที่อยู่ไกลออกไป ไม่ว่าในกรณีใดฉันจะต้องปรับ algorythm ให้กับโดเมนแอปพลิเคชันของฉัน แต่สิ่งที่ฉันตามมาก็คือกลยุทธ์การจับคู่ความสัมพันธ์ / การโน้มน้าว / การจับคู่รูปแบบ

(แก้ไข: มีภาพเพิ่มเติมด้านล่างและคำอธิบายเพิ่มเติมบางส่วน)

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: ตามที่ร้องขอฉันจะรวมภาพทั่วไปมากขึ้นทั้งประพฤติดีและมีปัญหา แต่แทนที่จะเป็นภาพ colormapped พวกมันเป็นภาพระดับสีเทาดังนั้นสีนั้นเกี่ยวข้องโดยตรงกับขนาดข้อมูลซึ่งไม่ได้เกิดขึ้นกับภาพสี (ให้เพื่อการสื่อสารเท่านั้น) แม้ว่าภาพสีเทาดูเหมือนว่าจะไม่มีความเปรียบต่างเมื่อเทียบกับภาพที่มีสี แต่การไล่ระดับสีของข้อมูลอยู่ที่นั่นและสามารถนำมาซึ่งความเปรียบต่างที่ปรับตัวได้หากต้องการ


1) ภาพของวัตถุที่มีความสมมาตรมาก:

ป้อนคำอธิบายรูปภาพที่นี่


2) ภาพของเรื่องเดียวกันในช่วงเวลาที่แตกต่างกัน แม้ว่าจะมี "คุณสมบัติ" เพิ่มเติม (การไล่ระดับสีมากขึ้น) แต่ก็ไม่ได้ "รู้สึก" สมมาตรเหมือนเมื่อก่อน:

ป้อนคำอธิบายรูปภาพที่นี่


3) เด็กเล็กบางคนที่มีนูน (มีกระดูกยื่นออกมาแสดงโดยบริเวณที่อ่อนกว่า) ที่กึ่งกลางแทนที่จะเป็นกึ่งกลางเว้าทั่วไป:

ป้อนคำอธิบายรูปภาพที่นี่


4) คนหนุ่มสาวที่มีกระดูกสันหลังส่วนเบี่ยงเบนได้รับการยืนยันโดย X-Ray (สังเกตความไม่สมดุล):

ป้อนคำอธิบายรูปภาพที่นี่


5) ตัวแบบ "เอียง" โดยทั่วไป (แม้ว่าส่วนใหญ่จะสมมาตรรอบเส้นกึ่งโค้งและไม่เป็นเช่นนั้น "ผิดรูป"):

ป้อนคำอธิบายรูปภาพที่นี่


ความช่วยเหลือใด ๆ ยินดีต้อนรับมาก!


ทำไมไม่ใช้กระดูกสันหลังเป็นตัวแบ่ง?
Jim Clay

@JimClay: ฉันสงสัยว่ากระดูกสันหลังเป็นส่วนหนึ่งที่ถูกวัดเทียบกับแกนที่แท้จริงของสมมาตรของภาพที่เหลือ
endolith

"เทคนิคการเย็บภาพบางอย่างใช้สิ่งนี้เพื่อ" ตรวจจับอัตโนมัติ "จุดที่คล้ายกันระหว่างภาพ" ทำสำเนาภาพที่พลิกแล้วใช้หนึ่งในนั้น :)
endolith

คุณสามารถสะท้อนภาพตามแกน Y และใช้อัลกอริทึมการลงทะเบียนได้หรือไม่? เนื่องจากมีงานวิจัยมากมายเกี่ยวกับอัลกอริทึมการลงทะเบียนที่ยืดหยุ่น / ไม่มีพารามิเตอร์ที่คุณสามารถสร้างได้
Niki Estner

JimClay กระดูกสันหลังคือสิ่งที่ฉันต้องการค้นหาฉันไม่รู้ว่ามันอยู่ที่ไหน Endolith คำถามของฉันเกี่ยวข้องกับคนที่บอกชื่อของอัลกอริทึมเหล่านั้นให้ฉันฉันยังไม่พบเลย และ Nikie นั่นคือประเด็นทั้งหมด แต่ฉันไม่ทราบว่ามีอัลกอริธึมเหล่านี้อย่างไรฉันจึงถามคำถามตั้งแต่แรก: o)
heltonbiker

คำตอบ:


9

ดังที่ฉันได้กล่าวไว้ในความคิดเห็นการลงทะเบียนอิมเมจทางการแพทย์เป็นหัวข้อที่มีงานวิจัยมากมายและฉันไม่ใช่ผู้เชี่ยวชาญ จากสิ่งที่ฉันได้อ่านแนวคิดพื้นฐานที่ใช้กันทั่วไปคือการกำหนดการแมประหว่างสองภาพ (ในกรณีของคุณเป็นรูปภาพและภาพสะท้อนในกระจก) จากนั้นกำหนดคำศัพท์ด้านพลังงานเพื่อความเรียบเนียนและเพื่อความคล้ายคลึงกันของภาพ ปรับการแมปนี้ให้เหมาะสมโดยใช้เทคนิคการเพิ่มประสิทธิภาพมาตรฐาน (หรือบางครั้งเฉพาะแอปพลิเคชัน)

ฉันแฮ็กอัลกอริทึมอย่างรวดเร็วใน Mathematica เพื่อสาธิตสิ่งนี้ นี่ไม่ใช่อัลกอริทึมที่คุณควรใช้ในแอปพลิเคชันทางการแพทย์เพียงการสาธิตความคิดพื้นฐาน

ก่อนอื่นฉันโหลดภาพของคุณแล้วสะท้อนและแยกภาพเหล่านี้ออกเป็นบล็อคเล็ก ๆ :

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]

กราฟิกทางคณิตศาสตร์

โดยปกติเราจะทำการลงทะเบียนอย่างเข้มงวดโดยประมาณ (ใช้เช่นจุดสำคัญหรือช่วงเวลาของภาพ) แต่ภาพของคุณอยู่กึ่งกลางดังนั้นฉันจะข้ามสิ่งนี้

ถ้าเราดูที่บล็อกหนึ่งและเป็นสำเนาของภาพสะท้อนในกระจก:

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

กราฟิกทางคณิตศาสตร์

เราจะเห็นว่าพวกมันคล้ายกัน แต่เปลี่ยนไป ปริมาณและทิศทางของการเปลี่ยนแปลงคือสิ่งที่เราพยายามหา

ในการหาปริมาณความคล้ายคลึงกันของการจับคู่ฉันสามารถใช้ระยะทางแบบยุคลิดกำลังสองได้:

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

กราฟิกทางคณิตศาสตร์

น่าเศร้าที่การใช้ข้อมูลนี้เป็นการเพิ่มประสิทธิภาพโดยตรงนั้นยากกว่าที่ฉันคิดดังนั้นฉันจึงใช้การประมาณอันดับสองแทน:

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}]

กราฟิกทางคณิตศาสตร์

ฟังก์ชั่นไม่เหมือนกับฟังก์ชั่นสหสัมพันธ์จริง แต่ใกล้พอสำหรับขั้นตอนแรก ลองคำนวณสิ่งนี้สำหรับบล็อกทุกคู่:

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];

สิ่งนี้ทำให้เราได้คำศัพท์เกี่ยวกับพลังงานครั้งแรกสำหรับการปรับให้เหมาะสม:

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

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

variablesX/Yมีออฟเซ็ตสำหรับแต่ละบล็อกและmatchEnergyFitประมาณความแตกต่าง euclidean ยกกำลังสองระหว่างรูปภาพต้นฉบับและรูปภาพที่มิร์เรอร์โดยใช้ออฟเซ็ต

การเพิ่มประสิทธิภาพพลังงานนี้เพียงอย่างเดียวจะให้ผลลัพธ์ที่ไม่ดี (หากรวมกันทั้งหมด) นอกจากนี้เรายังต้องการให้ออฟเซ็ตนั้นเรียบโดยที่ความคล้ายคลึงกันของบล็อกบอกว่าไม่มีอะไรเกี่ยวกับออฟเซ็ต (เช่นตามเส้นตรงหรือในพื้นหลังสีขาว)

ดังนั้นเราจึงตั้งค่าคำศัพท์พลังงานที่สองเพื่อความราบรื่น:

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]];

โชคดีที่การเพิ่มประสิทธิภาพที่ จำกัด มีอยู่แล้วใน Mathematica:

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

ลองดูผลลัพธ์:

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]
   }]]

กราฟิกทางคณิตศาสตร์

0.1ปัจจัยก่อนที่จะsmoothnessEnergyเป็นน้ำหนักสัมพัทธ์พลังงานเรียบที่ได้รับในความสัมพันธ์กับระยะพลังงานจับคู่ภาพ ผลลัพธ์เหล่านี้มีน้ำหนักต่างกัน:

กราฟิกทางคณิตศาสตร์

การปรับปรุงที่เป็นไปได้:

  • อย่างที่ฉันบอกให้ทำการลงทะเบียนอย่างเข้มงวดก่อน ด้วยพื้นหลังสีขาวการลงทะเบียนตามช่วงเวลาของภาพอย่างง่ายควรทำงานได้ดี
  • นี่เป็นเพียงขั้นตอนเดียว คุณสามารถใช้ออฟเซ็ตที่คุณพบในขั้นตอนเดียวและปรับปรุงในขั้นตอนที่สองอาจมีหน้าต่างค้นหาที่เล็กกว่าหรือขนาดบล็อกเล็กกว่า
  • ฉันได้อ่านบทความที่พวกเขาทำสิ่งนี้โดยไม่มีบล็อกเลย แต่ปรับออฟเซตต่อพิกเซล
  • ลองฟังก์ชั่นความนุ่มนวลที่แตกต่างกัน

คำตอบที่ยาวเกินไปที่จะอ่านเพื่อความสนุกสนาน แต่ภาพสุดท้ายนั้นบ่งบอกได้ค่อนข้างดี: มันดูน่าทึ่ง: D
penelope

คำตอบนี้ให้ความกระจ่างมาก ฉันจะต้องใช้เวลาในการกลืน แต่ส่วนใหญ่อาจเป็นเทคนิคการลงทะเบียนไม่เข้มงวดเป็นสิ่งที่ฉันจะต้องใช้ โชคดีที่คุณให้รายละเอียดเกี่ยวกับแนวคิดดังนั้นในกรณีที่แย่ที่สุดฉันสามารถหาวิธีที่คล้ายกันได้ ในระหว่างนี้ฉันจะอัปเดตคำถามด้วยภาพเพิ่มเติม ขอบคุณสำหรับตอนนี้!
heltonbiker

4

คำถามที่น่าสนใจ ครั้งแรกบางทีคุณอาจจะอยู่หลังการพิจารณาตามเครื่องตรวจจับจุดสนใจและการจับคู่ ซึ่งจะรวมถึงSIFT (การแปลงฟีเจอร์คงที่), SURF, ORB, ฯลฯ ... หรือแม้กระทั่งวิธีการที่ง่ายขึ้นตามผู้ดำเนินการของ Harris (csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf เท่านั้น) ) มันไม่ชัดเจนจากโพสต์ของคุณในสิ่งที่คุณได้ลองดังนั้นฉันขอโทษถ้าฉันไร้เดียงสาที่นี่

กล่าวว่าให้ฉันใช้วิธีที่ง่ายขึ้นกับ Mathematical Morphology (MM) เพื่อความสนุกสนาน :) ภาพสำหรับการสร้างภาพของขั้นตอนทั้งหมดนั้นสิ้นสุดแล้ว

ฉันนำภาพตัวอย่างของคุณมาแปลงเป็นสี L a b * โดยใช้ ImageMagick และใช้เฉพาะแถบ L *:

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

0.png สอดคล้องกับ L * band ตอนนี้ฉันแน่ใจว่าคุณมีข้อมูลภาพที่แท้จริง แต่ฉันกำลังจัดการกับการบีบอัด jpg และสิ่งที่ไม่ เพื่อจัดการกับปัญหานี้บางส่วนฉันได้ทำการเปิดก้านตามด้วยการปิดทางสัณฐานวิทยาด้วยดิสก์แบนของรัศมี 5 นี่เป็นวิธีพื้นฐานในการลดเสียงรบกวนด้วย MM และทำให้รัศมีของดิสก์ไม่มากของภาพที่เปลี่ยนไป ต่อไปความคิดของฉันขึ้นอยู่กับภาพเดียวนี้ซึ่งมีโอกาสมากที่จะล้มเหลวในกรณีอื่น ๆ ภูมิภาคที่คุณสนใจนั้นมีความโดดเด่นทางสายตาโดยการเข้มขึ้น ("ร้อนกว่า" ในภาพสีของคุณ) ดังนั้นฉันจึงคิดว่าเครื่องมือที่ใช้ไบนาไนเซอร์ที่ทำงานในเชิงสถิติจะทำงานได้ดี ฉันใช้วิธีของ Otsu ซึ่งเป็นระบบอัตโนมัติ

เมื่อมาถึงจุดนี้มันเป็นไปได้ที่จะเห็นภาพชัดเจนว่าภาคกลางที่น่าสนใจ ปัญหาคือว่าในแนวทางของฉันฉันต้องการให้มันเป็นองค์ประกอบปิด แต่ไม่ใช่ ฉันเริ่มต้นด้วยการละทิ้งทุกองค์ประกอบที่เชื่อมต่อที่เล็กกว่าอันที่ใหญ่ที่สุด (ไม่นับพื้นหลังเป็นหนึ่งในนั้น) นี่เป็นโอกาสที่ดีกว่าที่จะทำงานในกรณีอื่น ๆ หากผลการไบนาไนเซชันเป็นสิ่งที่ดี ในภาพตัวอย่างของคุณมีองค์ประกอบหนึ่งเชื่อมต่อกับพื้นหลังดังนั้นจึงไม่ได้ถูกทิ้ง แต่มันไม่ทำให้เกิดปัญหา

หากคุณยังติดตามฉันอยู่เรายังไม่พบภูมิภาคกลางที่น่าสนใจที่แท้จริง นี่คือสิ่งที่ฉันทำ ไม่ว่าบุคคลนั้นจะโค้งงอเพียงใด (จริง ๆ แล้วฉันเห็นกรณีที่มีปัญหา) ภูมิภาคนั้นมีลักษณะเป็นเส้นแนวตั้ง ด้วยเหตุนี้ฉันจึงทำให้ภาพปัจจุบันง่ายขึ้นด้วยการเปิดก้านที่มีความยาวแนวตั้ง 100 ความยาวนี้เป็นความบริสุทธิ์โดยพลการหากคุณไม่มีปัญหาในการปรับมาตราส่วนนี่ไม่ใช่ค่ายากที่จะพิจารณา ตอนนี้เราละทิ้งองค์ประกอบอีกครั้ง แต่ฉันก็ระวังให้มากขึ้นในขั้นตอนนี้ ฉันใช้การเปิดโดยพื้นที่พร้อมส่วนเสริมของภาพเพื่อละทิ้งสิ่งที่ฉันคิดว่าเป็นพื้นที่เล็ก ๆ สิ่งนี้สามารถทำได้ในลักษณะที่ควบคุมได้มากขึ้นโดยดำเนินการบางอย่างในรูปแบบของการวิเคราะห์ granulometrics (จาก MM ด้วย)

ตอนนี้เรามีสามชิ้นโดยประมาณ: ส่วนด้านซ้ายของรูปภาพส่วนกลางและส่วนขวาของรูปภาพ ส่วนภาคกลางคาดว่าจะเป็นองค์ประกอบที่เล็กกว่าของทั้งสามดังนั้นจึงได้รับเล็กน้อย

นี่คือผลลัพธ์สุดท้ายภาพด้านล่างขวาเป็นเพียงภาพที่ถูกวางไว้ทางซ้ายสุดด้วยภาพต้นฉบับ ตัวเลขแต่ละตัวไม่ได้เรียงกันทั้งหมดขอโทษสำหรับความรีบร้อน

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


ขอบคุณมากสำหรับความสนใจของคุณ แต่วิธีการของคุณควรพิจารณาคุณสมบัติบางอย่างของข้อมูลของฉัน (ไม่ใช่การร้องเรียนเพียงรายละเอียด): 1) ข้อมูลจริงคืออาร์เรย์ 2 มิติของโฟลท, colormapped ด้วยสีแดงเหลือง - colormap สีเขียวใน matplotlib ของงูใหญ่ ฉันไม่คิดว่าการทำงานกับข้อมูลสีจะถูกต้องตามหลักความคิดภาพจะแสดงเพื่อการสื่อสารเท่านั้น 2) ข้อมูลจริงเกี่ยวข้องกับความโค้งของพื้นผิว (นูนกับเว้า) ส่วนสีแดงเป็นส่วนเว้าส่วนสีเขียวเป็นส่วนนูน แกนสมมาตรไม่จำเป็นต้องตกอยู่ในบริเวณเว้า
heltonbiker

ฉันจะเพิ่มรูปภาพอีกไม่นาน (และแทนที่รูปภาพนี้ด้วยรูปภาพระดับสีเทา) เพื่อให้สามารถใช้ภาพตัวเองสำหรับการทดสอบกำจัดอันตรายจากความผิดเพี้ยนของช่วงไดนามิกเนื่องจากสี
heltonbiker

ข้อมูลยังไม่พร้อมให้บริการ ภาพระดับสีเทานั้นอยู่ในระดับที่ใกล้เคียงที่สุด
mmgp

ฉันเชื่อว่าการประมาณค่าส่วนใหญ่น่าจะเพียงพอ แต่ฉันไม่สนใจที่จะให้ข้อมูลจริง ฉันสามารถโพสต์ลิงก์ดาวน์โหลด DropBox สาธารณะบางอันโดยไม่รู้ว่าอยู่ในรูปแบบไฟล์ใด
heltonbiker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.