บทนำ
นี่คือการดำเนินการของการกำจัดวัตถุโดยการจัดการระบบสีแบบอย่างตามขั้นตอนวิธีการพัฒนาโดยเอ Criminisi, P. เปเรซ (เคมบริดจ์ Microsoft Research จำกัด ) และเคโทะยะมะ (Microsoft) [x] อัลกอริทึมนี้มีการกำหนดเป้าหมายที่รูปภาพข้อมูลสูง (และเฟรมวิดีโอ) และมีจุดมุ่งหมายเพื่อให้เกิดความสมดุลระหว่างการสร้างโครงสร้างใหม่และการสร้างใหม่แบบอินทรีย์ ย่อหน้าของคำตอบนี้ประกอบด้วยคำพูดแบบเต็มจากกระดาษต้นฉบับ (เนื่องจากไม่มีให้บริการอย่างเป็นทางการอีกต่อไป) เพื่อทำให้คำตอบนี้มีอยู่ในตัวเองมากขึ้น
อัลกอริทึม
เป้าหมาย : แทนที่พื้นที่ ( ปิดบัง ) ที่เลือก ( ควรเป็นวัตถุเบื้องหน้าที่แยกออกมาทางสายตา) โดยใช้พื้นหลังที่เป็นไปได้
ในงานก่อนหน้านักวิจัยหลายคนคิดว่าการสังเคราะห์พื้นผิวเป็นวิธีหนึ่งในการเติมเต็มพื้นที่ภาพขนาดใหญ่ด้วยพื้นผิวที่ "บริสุทธิ์" - ลวดลายพื้นผิวสองมิติแบบซ้ำ ๆ ที่มีความเสถียรปานกลาง นี่คือพื้นฐานของการวิจัยการสังเคราะห์เนื้อ - ร่างใหญ่ซึ่งพยายามที่จะทำซ้ำโฆษณาพื้นผิวinfinitumให้เป็นแหล่งเล็ก ๆ ของตัวอย่างเนื้อบริสุทธิ์[1] [8] [9] [10] [11] [12] [14] [15] [16] [19] [22]
ที่มีประสิทธิภาพเป็นเทคนิคเหล่านี้อยู่ในการจำลองพื้นผิวที่สอดคล้องกันที่พวกเขามีความยากลำบากในการกรอกหลุมในภาพของฉากจริงของโลกซึ่งมักจะประกอบด้วยโครงสร้างเชิงเส้นและพื้นผิวคอมโพสิต - พื้นผิวหลายปฏิสัมพันธ์เชิงพื้นที่[23] ปัญหาหลักคือขอบเขตระหว่างพื้นที่ภาพเป็นผลิตภัณฑ์ที่ซับซ้อนของอิทธิพลร่วมกันระหว่างพื้นผิวที่แตกต่างกัน ตรงกันข้ามกับธรรมชาติสองมิติของพื้นผิวบริสุทธิ์ขอบเขตเหล่านี้ก่อให้เกิดสิ่งที่อาจถูกพิจารณาว่าเป็นโครงสร้างภาพแบบหนึ่งมิติหรือเป็นเส้นตรงมากขึ้น
เทคนิคการระบายสีภาพเติมช่องว่างในภาพโดยแพร่กระจายโครงสร้างเชิงเส้น (เรียกว่าisophotesในวรรณคดีการทาสี ) เข้าสู่พื้นที่เป้าหมายผ่านการแพร่กระจาย พวกเขาได้รับแรงบันดาลใจจากสมการเชิงอนุพันธ์ย่อยของการไหลของความร้อนทางกายภาพและทำงานเป็นอัลกอริทึมการฟื้นฟู ข้อเสียเปรียบของพวกเขาคือกระบวนการแพร่กระจายนั้นทำให้เกิดภาพเบลอซึ่งเห็นได้ชัด
ภูมิภาคที่จะเติมเต็มคือพื้นที่เป้าหมายถูกระบุด้วย and และเส้นชั้นความสูงจะแสดงเป็น den เส้นชั้นความสูงวิวัฒนาการเข้าด้านในขณะที่อัลกอริธึมดำเนินไปดังนั้นเราจึงเรียกมันว่าเป็น“ ส่วนเติมด้านหน้า” ขอบเขตแหล่งที่มา, which ซึ่งยังคงอยู่ตลอดทั้งอัลกอริทึมให้ตัวอย่างที่ใช้ในกระบวนการเติม ตอนนี้เรามุ่งเน้นไปที่การวนซ้ำของอัลกอริทึมเพื่อแสดงว่าโครงสร้างและพื้นผิวได้รับการจัดการอย่างเพียงพอโดยการสังเคราะห์แบบอย่าง สมมติว่าเทมเพลตสแควร์Ψp∈Ωอยู่กึ่งกลางที่จุด p (รูปที่ 2b) จะต้องถูกเติม ตัวอย่างการจับคู่ที่ดีที่สุดจากภูมิภาคต้นทางมาจากแพตช์ Ψqˆ ∈Φซึ่งคล้ายกับชิ้นส่วนเหล่านั้นที่เติมในΨpอยู่แล้ว ในตัวอย่างในรูป 2b เราจะเห็นว่าถ้าΨpอยู่บนขอบภาพต่อเนื่อง การจับคู่ที่ดีที่สุดที่น่าจะเป็นไปตามขอบ (หรือสีที่คล้ายกัน) (เช่น'q 'และΨq' 'ในรูปที่ 2c) ทั้งหมดที่จำเป็นในการเผยแพร่ isophote เข้ามาคือการถ่ายโอนรูปแบบง่าย ๆ จากแพทช์แหล่งที่มาที่ตรงที่สุด (รูปที่ 2d) ขอให้สังเกตว่าการวางแนว isophote จะถูกเก็บไว้โดยอัตโนมัติ ในภาพแม้ว่าความจริงที่ว่าขอบดั้งเดิมไม่ได้เป็นมุมฉากกับรูปร่างเป้าหมาย structure โครงสร้างที่แพร่กระจายยังคงมีการวางแนวเดียวกันกับในภูมิภาคต้นทาง
รายละเอียดการใช้งานและอัลกอริทึม
ฟังก์ชันการทำงานของการใช้งานนี้ถูกห่อหุ้มใน ActiveX COM DLL ซึ่งถูกปล่อยออกจากโปรแกรมโฮสต์เป็นไบนารีแล้วเรียกใช้งานได้ทันทีโดยการเรียกใช้ inpainter โดย IID ในกรณีเฉพาะนี้ API ถูกเขียนใน VisualBasic และสามารถเรียกได้จากภาษาที่เปิดใช้งาน COM ส่วนต่อไปนี้ของรหัสวางไบนารี:
Func deflate($e=DllStructCreate,$f=@ScriptDir&"\inpaint.dll")
If FileExists($f) Then Return
!! BINARY CODE OMITTED FOR SIZE REASONS !!
$a=$e("byte a[13015]")
DllCall("Crypt32.dll","bool","CryptStringToBinaryA","str",$_,"int",0,"int",1,"struct*",$a,"int*",13015,"ptr",0,"ptr",0)
$_=$a.a
$b=$e('byte a[13015]')
$b.a=$_
$c=$e("byte a[14848]")
DllCall("ntdll.dll","int","RtlDecompressBuffer","int",2,"struct*",$c,"int",14848,"struct*",$b,"int",13015,"int*",0)
$d=FileOpen(@ScriptDir&"\inpaint.dll",18)
FileWrite($d,Binary($c.a))
FileClose($d)
EndFunc
ไลบรารีถูกสร้างอินสแตนซ์ในภายหลังโดยใช้ CLSID และ IID:
Local $hInpaintLib = DllOpen("inpaint.dll")
Local $oInpaintLib = ObjCreate("{3D0C8F8D-D246-41D6-BC18-3CF18F283429}", "{2B0D9752-15E8-4B52-9569-F64A0B12FFC5}", $hInpaintLib)
ไลบรารียอมรับตัวจัดการ GDIOBJECT โดยเฉพาะ DIBSection ของ GDI / + บิตแมปใด ๆ (ไฟล์สตรีมและอื่น ๆ ) ไฟล์รูปภาพที่ระบุถูกโหลดและวาดลงบนบิตแมปเปล่าที่สร้างขึ้นจากScan0
ขนาดภาพอินพุต
ไฟล์อินพุตสำหรับการนำไปใช้งานนี้เป็นรูปแบบไฟล์ใด ๆ ที่เข้ากันได้กับ GDI / + ซึ่งมีข้อมูลภาพที่ถูกปิดบังไว้ มาสก์ (s)เป็นหนึ่งหรือหลายภูมิภาคที่มีสีสม่ำเสมอในภาพอินพุต ผู้ใช้ป้อนค่าสี RGB สำหรับมาสก์มีเพียงพิกเซลที่มีค่าสีตรงกันเท่านั้น สีกำบังเริ่มต้นคือสีเขียว (0, 255, 0) พื้นที่ที่ถูกพรางทั้งหมดรวมกันเป็นตัวแทนของภูมิภาคเป้าหมายΩที่จะถูกลบออกและเติมเต็ม ขอบเขตของแหล่งที่มาคือΦถูกกำหนดให้เป็นรูปภาพทั้งหมดลบด้วยพื้นที่เป้าหมาย (Φ = I − Ω)
ถัดไปเช่นเดียวกับการสังเคราะห์พื้นผิวที่เป็นแบบอย่างทั้งหมด[10] ต้องระบุขนาดของหน้าต่างเทมเพลตΨ (หรือที่เรียกว่า " scan radius ") การใช้งานนี้มีขนาดหน้าต่างเริ่มต้นที่6²พิกเซล แต่ในทางปฏิบัติผู้ใช้จำเป็นต้องตั้งค่าให้ใหญ่กว่าองค์ประกอบพื้นผิวที่แตกต่างที่ใหญ่ที่สุดหรือ“ texel” ในพื้นที่ต้นทางเล็กน้อย การปรับเปลี่ยนเพิ่มเติมสำหรับอัลกอริทึมดั้งเดิมคือ " ขนาดบล็อก " ที่ผู้ใช้กำหนดซึ่งกำหนดพื้นที่ของพิกเซลที่จะถูกแทนที่ด้วยสีสม่ำเสมอใหม่ สิ่งนี้จะเพิ่มความเร็วและลดคุณภาพ ขนาดตัวต่อบล็อกที่มากกว่า 1px นั้นมีไว้เพื่อใช้กับพื้นที่ที่มีความสม่ำเสมอมาก (น้ำทรายขน ฯลฯ ) อย่างไรก็ตามควรรักษา kept ให้สูงสุด .5x ขนาดบล็อก (ซึ่งเป็นไปไม่ได้ขึ้นอยู่กับหน้ากาก)
เพื่อไม่ให้อัลกอริทึมหยุดภาพ 1 บิตทุกครั้งที่รับภาพที่มีสีน้อยกว่า 5 สีขนาดของหน้าต่างจะถูกขยายเป็น 10 เท่า
เมื่อกำหนดพารามิเตอร์เหล่านี้แล้วส่วนที่เหลือของกระบวนการเติมภูมิภาคจะเป็นไปโดยอัตโนมัติอย่างสมบูรณ์ ในอัลกอริทึมของเราแต่ละพิกเซลรักษาค่าสี (หรือ "ว่างเปล่า" หากพิกเซลไม่ได้บรรจุ) และค่าความเชื่อมั่นซึ่งสะท้อนถึงความมั่นใจของเราในค่าพิกเซลและจะถูกแช่แข็งเมื่อเติมพิกเซลแล้ว ในระหว่างอัลกอริทึมแพทช์ตามแนวเติมจะได้รับค่าลำดับความสำคัญชั่วคราวซึ่งกำหนดลำดับการเติม จากนั้นอัลกอริทึมของเราจะทำซ้ำสามขั้นตอนต่อไปนี้จนกว่าพิกเซลจะเต็ม
ขั้นตอนที่ 1: การคำนวณลำดับความสำคัญของโปรแกรมแก้ไข
กรอกข้อมูลเพื่อเป็นสิ่งสำคัญในการสังเคราะห์เนื้อไม่ใช่ตัวแปร[1] [6] [10] [13] จนถึงตอนนี้สิ่งที่ชื่นชอบเริ่มต้นคือวิธีการ "หัวหอมปอกเปลือก" ซึ่งพื้นที่เป้าหมายจะถูกสังเคราะห์จากด้านนอกเข้ามาด้านในในเลเยอร์ศูนย์กลาง อัลกอริทึมของเราดำเนินงานนี้ผ่านอัลกอริธึมการบรรจุขั้นแรกที่ดีที่สุดโดยขึ้นอยู่กับค่าลำดับความสำคัญที่กำหนดให้แต่ละชุดข้อมูลด้านหน้าการเติม การคำนวณลำดับความสำคัญจะเอนเอียงไปทางแพตช์ที่อยู่บนขอบของขอบที่แข็งแกร่งและล้อมรอบด้วยพิกเซลที่มีความมั่นใจสูงพิกเซลเหล่านี้เป็นขอบเขตที่ทำเครื่องหมายด้วยค่า -2 รหัสต่อไปนี้คำนวณลำดับความสำคัญใหม่:
For j = m_top To m_bottom: Y = j * m_width: For i = m_left To m_right
If m_mark(Y + i) = -2 Then m_pri(Y + i) = ComputeConfidence(i, j) * ComputeData(i, j)
Next i: Next j
เมื่อให้ patchp อยู่ตรงกลางที่จุด p สำหรับบาง p ∈δΩ (ดูรูปที่ 3), ลำดับความสำคัญ P (p) ถูกกำหนดเป็นผลคูณของความเชื่อมั่นที่คำนวณได้ ( ComputeConfidence
, หรือC (p) ) และคำข้อมูล ( ComputeData
, หรือD (p) ) ที่ไหน
ที่ไหน
| Ψp | คือพื้นที่ของΨp, αเป็นปัจจัยการทำให้เป็นมาตรฐาน (เช่นα = 255 สำหรับภาพระดับสีเทาทั่วไป) และ np คือเวกเตอร์หน่วยมุมฉากต่อหน้าδΩในจุด p ลำดับความสำคัญจะถูกคำนวณสำหรับทุกปะของเส้นขอบด้วยแพทช์ที่แตกต่างกันสำหรับแต่ละพิกเซลบนขอบเขตของพื้นที่เป้าหมาย
ดำเนินการเป็น
Private Function ComputeConfidence(ByVal i As Long, ByVal j As Long) As Double
Dim confidence As Double
Dim X, Y As Long
For Y = IIf(j - Winsize > 0, j - Winsize, 0) To IIf(j + Winsize < m_height - 1, j + Winsize, m_height - 1): For X = IIf(i - Winsize > 0, i - Winsize, 0) To IIf(i + Winsize < m_width - 1, i + Winsize, m_width - 1)
confidence = confidence + m_confid(Y * m_width + X)
Next X: Next Y
ComputeConfidence = confidence / ((Winsize * 2 + 1) * (Winsize * 2 + 1))
End Function
Private Function ComputeData(ByVal i As Long, ByVal j As Long) As Double
Dim grad As CPOINT
Dim temp As CPOINT
Dim grad_T As CPOINT
Dim result As Double
Dim magnitude As Double
Dim max As Double
Dim X As Long
Dim Y As Long
Dim nn As CPOINT
Dim Found As Boolean
Dim Count, num As Long
Dim neighbor_x(8) As Long
Dim neighbor_y(8) As Long
Dim record(8) As Long
Dim n_x As Long
Dim n_y As Long
Dim tempL As Long
Dim square As Double
For Y = IIf(j - Winsize > 0, j - Winsize, 0) To IIf(j + Winsize < m_height - 1, j + Winsize, m_height - 1): For X = IIf(i - Winsize > 0, i - Winsize, 0) To IIf(i + Winsize < m_width - 1, i + Winsize, m_width - 1)
If m_mark(Y * m_width + X) >= 0 Then
Found = False
Found = m_mark(Y * m_width + X + 1) < 0 Or m_mark(Y * m_width + X - 1) < 0 Or m_mark((Y + 1) * m_width + X) < 0 Or m_mark((Y - 1) * m_width + X) < 0
If Found = False Then
temp.X = IIf(X = 0, m_gray(Y * m_width + X + 1) - m_gray(Y * m_width + X), IIf(X = m_width - 1, m_gray(Y * m_width + X) - m_gray(Y * m_width + X - 1), (m_gray(Y * m_width + X + 1) - m_gray(Y * m_width + X - 1)) / 2#))
temp.Y = IIf(Y = 0, m_gray((Y + 1) * m_width + X) - m_gray(Y * m_width + X), IIf(Y = m_height - 1, m_gray(Y * m_width + X) - m_gray((Y - 1) * m_width + X), (m_gray((Y + 1) * m_width + X) - m_gray((Y - 1) * m_width + X)) / 2#))
magnitude = temp.X ^ 2 + temp.Y ^ 2
If magnitude > max Then
grad.X = temp.X
grad.Y = temp.Y
max = magnitude
End If
End If
End If
Next X: Next Y
grad_T.X = grad.Y
grad_T.Y = -grad.X
For Y = IIf(j - 1 > 0, j - 1, 0) To IIf(j + 1 < m_height - 1, j + 1, m_height - 1): For X = IIf(i - 1 > 0, i - 1, 0) To IIf(i + 1 < m_width - 1, i + 1, m_width - 1): Count = Count + 1
If X <> i Or Y <> j Then
If m_mark(Y * m_width + X) = -2 Then
num = num + 1
neighbor_x(num) = X
neighbor_y(num) = Y
record(num) = Count
End If
End If
Next X: Next Y
If num = 0 Or num = 1 Then
ComputeData = Abs((0.6 * grad_T.X + 0.8 * grad_T.Y) / 255)
Else
n_x = neighbor_y(2) - neighbor_y(1)
n_y = neighbor_x(2) - neighbor_x(1)
square = CDbl(n_x ^ 2 + n_y ^ 2) ^ 0.5
ComputeData = Abs((IIf(n_x = 0, 0, n_x / square) * grad_T.X + IIf(n_y = 0, 0, n_y / square) * grad_T.Y) / 255)
End If
End Function
ศัพท์ความเชื่อมั่น C (p) อาจถูกมองว่าเป็นตัวชี้วัดปริมาณข้อมูลที่เชื่อถือได้รอบพิกเซล p ความตั้งใจคือการเติมแพทช์แรกที่มีจำนวนพิกเซลมากกว่าแล้วโดยมีการกำหนดค่าเพิ่มเติมให้กับพิกเซลที่ได้รับการเติมก่อนหน้า (หรือไม่เคยเป็นส่วนหนึ่งของภูมิภาคเป้าหมาย)
สิ่งนี้จะรวมการตั้งค่าไปยังรูปร่างบางรูปร่างโดยอัตโนมัติตามแนวหน้าเติม ตัวอย่างเช่นแพทช์ที่มีมุมและเส้นเอ็นบาง ๆ ของพื้นที่เป้าหมายจะมีแนวโน้มที่จะถูกเติมเต็มก่อนเนื่องจากมีการล้อมรอบด้วยพิกเซลจำนวนมากจากภาพต้นฉบับ แพทช์เหล่านี้ให้ข้อมูลที่น่าเชื่อถือมากกว่าที่จะจับคู่ ในทางกลับกันแพทช์ที่ส่วนปลายของ“ เพนนิซิลัส” ของพิกเซลที่เติมเต็มซึ่งยื่นออกไปในพื้นที่เป้าหมายจะมีการตั้งค่าไว้จนกว่าจะมีการเติมพิกเซลโดยรอบในระดับหยาบคำ C (p) ของ (1) ประมาณ บังคับใช้คำสั่งการเติมแบบศูนย์กลางที่ต้องการ
เมื่อเติมรายได้พิกเซลในเลเยอร์ด้านนอกของพื้นที่เป้าหมายจะมีแนวโน้มที่จะโดดเด่นด้วยค่าความเชื่อมั่นที่มากขึ้นและดังนั้นจึงจะเต็มไปก่อนหน้านี้ พิกเซลที่อยู่ตรงกลางของภูมิภาคเป้าหมายจะมีค่าความมั่นใจน้อยลง data data D (p) เป็นฟังก์ชั่นของความแรงของ isophotes ที่กดปุ่มδΩด้านหน้าในแต่ละการวนซ้ำ คำนี้ช่วยเพิ่มความสำคัญของแพทช์ที่ไอโซโฟท "ไหล" เข้ามา ปัจจัยนี้มีความสำคัญขั้นพื้นฐานในอัลกอริทึมของเราเพราะมันสนับสนุนโครงสร้างเชิงเส้นที่จะสังเคราะห์ก่อนและจึงแพร่กระจายอย่างปลอดภัยในภูมิภาคเป้าหมาย สายหักมีแนวโน้มที่จะเชื่อมต่อจึงตระหนักถึง "การเชื่อมต่อ" หลักการของวิสัยทัศน์จิตวิทยา[7] [17]
การสั่งซื้อที่เติมขึ้นอยู่กับคุณสมบัติของภาพที่เกิดในกระบวนการสังเคราะห์สารอินทรีย์ที่ช่วยลดความเสี่ยงของการ“เสียโครงสร้าง” สิ่งประดิษฐ์และยังช่วยลดสิ่งประดิษฐ์บล็อกโดยไม่ต้องแพทช์ตัดขั้นตอนที่มีราคาแพง[9]หรือขั้นตอนการผสมเบลอชักนำ[19 ] .
ขั้นตอนที่ 2: การกระจายข้อมูลพื้นผิวและโครงสร้าง
เมื่อคำนวณลำดับความสำคัญทั้งหมดในส่วนเติมด้านหน้า ( ขอบเขต ) แล้วจะพบ patch ˆpˆ ที่มีลำดับความสำคัญสูงสุด จากนั้นเราจะกรอกข้อมูลที่ดึงมาจากขอบเขตแหล่งที่มาΦ เราเผยแพร่ภาพพื้นผิวโดยการสุ่มตัวอย่างโดยตรงของภูมิภาคต้นทาง คล้ายกับ[10]เราค้นหาในพื้นที่ต้นทางสำหรับแพทช์นั้นซึ่งคล้ายกับ similarpˆ มากที่สุด อย่างเป็นทางการ
ที่ไหน
ระยะทาง d (Ψa, Ψb) ระหว่างสองแพตช์ทั่วไปΨaและΨbนั้นถูกกำหนดเพียงแค่ผลรวมของความแตกต่างยกกำลังสอง (SSD) ของพิกเซลที่เติมเต็มแล้วในแพทช์สองตัว ไม่มีการวิเคราะห์หรือการจัดการเพิ่มเติม ( โดยเฉพาะอย่างยิ่งไม่มีการเบลอ ) ในขั้นตอนนี้ การคำนวณนี้ทำงานในวงจรวนรอบหลักและมีการใช้งานดังนี้:
รับลำดับความสำคัญสูงสุด:
For j = m_top To m_bottom: Jidx = j * m_width: For i = m_left To m_right
If m_mark(Jidx + i) = -2 And m_pri(Jidx + i) > max_pri Then
pri_x = i
pri_y = j
max_pri = m_pri(Jidx + i)
End If
Next i: Next j
ค้นหาแพทช์ที่คล้ายกันมากที่สุด:
min = 99999999
For j = PatchT To PatchB: Jidx = j * m_width: For i = PatchL To PatchR
If m_source(Jidx + i) Then
sum = 0
For iter_y = -Winsize To Winsize: target_y = pri_y + iter_y
If target_y > 0 And target_y < m_height Then
target_y = target_y * m_width: For iter_x = -Winsize To Winsize: target_x = pri_x + iter_x
If target_x > 0 And target_x < m_width Then
Tidx = target_y + target_x
If m_mark(Tidx) >= 0 Then
source_x = i + iter_x
source_y = j + iter_y
Sidx = source_y * m_width + source_x
temp_r = m_r(Tidx) - m_r(Sidx)
temp_g = m_g(Tidx) - m_g(Sidx)
temp_b = m_b(Tidx) - m_b(Sidx)
sum = sum + temp_r * temp_r + temp_g * temp_g + temp_b * temp_b
End If
End If
Next iter_x
End If
Next iter_y
If sum < min Then: min = sum: patch_x = i: patch_y = j
End If
Next i: Next j
ขั้นตอนที่ 3: การอัปเดตค่าความมั่นใจ
หลังจากแพทช์Ψp patch เต็มไปด้วยค่าพิกเซลใหม่ความเชื่อมั่น C (p) จะถูกอัปเดตในพื้นที่ที่คั่นด้วย imitedpˆ ดังนี้:
กฎการอัปเดตอย่างง่ายนี้ช่วยให้เราสามารถวัดความมั่นใจสัมพัทธ์ของแพทช์ที่ด้านหน้าเติมได้โดยไม่ต้องใช้พารามิเตอร์เฉพาะภาพ เมื่อกรอกรายได้แล้วค่าความเชื่อมั่นจะลดลงซึ่งบ่งชี้ว่าเราไม่แน่ใจเกี่ยวกับค่าสีของพิกเซลใกล้กับกึ่งกลางของพื้นที่เป้าหมาย ดำเนินการที่นี่ (พร้อมกับการอัปเดตที่จำเป็นอื่น ๆ ทั้งหมด):
x0 = -Winsize
For iter_y = -Winsize To Winsize: For iter_x = -Winsize To Winsize
x0 = patch_x + iter_x
y0 = patch_y + iter_y
x1 = pri_x + iter_x
y1 = pri_y + iter_y
X1idx = y1 * m_width + x1
If m_mark(X1idx) < 0 Then
X0idx = y0 * m_width + x0
PicAr1(x1, y1) = m_color(X0idx)
m_color(X1idx) = m_color(X0idx)
m_r(X1idx) = m_r(X0idx)
m_g(X1idx) = m_g(X0idx)
m_b(X1idx) = m_b(X0idx)
m_gray(X1idx) = CDbl((m_r(X0idx) * 3735 + m_g(X0idx) * 19267 + m_b(X0idx) * 9765) / 32767)
m_confid(X1idx) = ComputeConfidence(pri_x, pri_y)
End If
Next iter_x: Next iter_y
For Y = IIf(pri_y - Winsize - 2 > 0, pri_y - Winsize - 2, 0) To IIf(pri_y + Winsize + 2 < m_height - 1, pri_y + Winsize + 2, m_height - 1): Yidx = Y * m_width: For X = IIf(pri_x - Winsize - 2 > 0, pri_x - Winsize - 2, 0) To IIf(pri_x + Winsize + 2 < m_width - 1, pri_x + Winsize + 2, m_width - 1)
m_mark(Yidx + X) = IIf(PicAr1(X, Y).rgbRed = MaskRed And PicAr1(X, Y).rgbgreen = MaskGreen And PicAr1(X, Y).rgbBlue = MaskBlue, -1, Source)
Next X: Next Y
For Y = IIf(pri_y - Winsize - 2 > 0, pri_y - Winsize - 2, 0) To IIf(pri_y + Winsize + 2 < m_height - 1, pri_y + Winsize + 2, m_height - 1): Yidx = Y * m_width: For X = IIf(pri_x - Winsize - 2 > 0, pri_x - Winsize - 2, 0) To IIf(pri_x + Winsize + 2 < m_width - 1, pri_x + Winsize + 2, m_width - 1)
If m_mark(Yidx + X) = -1 Then
Found = (Y = m_height - 1 Or Y = 0 Or X = 0 Or X = m_width - 1) Or m_mark(Yidx + X - 1) = Source Or m_mark(Yidx + X + 1) = Source Or m_mark((Y - 1) * m_width + X) = Source Or m_mark((Y + 1) * m_width + X) = Source
If Found Then: Found = False: m_mark(Yidx + X) = -2
End If
Next X: Next Y
For i = IIf(pri_y - Winsize - 3 > 0, pri_y - Winsize - 3, 0) To IIf(pri_y + Winsize + 3 < m_height - 1, pri_y + Winsize + 3, m_height - 1): Yidx = i * m_width: For j = IIf(pri_x - Winsize - 3 > 0, pri_x - Winsize - 3, 0) To IIf(pri_x + Winsize + 3 < m_width - 1, pri_x + Winsize + 3, m_width - 1)
If m_mark(Yidx + j) = -2 Then m_pri(Yidx + j) = ComputeConfidence(j, i) * ComputeData(j, i)
Next j: Next i
กรอกรหัส
นี่คือโค้ดที่สามารถใช้งานได้พร้อมด้วยซอร์สโค้ดของไลบรารีเป็นความคิดเห็น
รหัสถูกเรียกใช้โดย
inpaint(infile, outfile, blocksize, windowsize, r, g, b)
ตัวอย่างจะรวมอยู่ในรูปแบบของ
;~ inpaint("gothic_in.png", "gothic_out.png")
;~ inpaint("starry_in.png", "starry_out.png")
;~ inpaint("scream_in.png", "scream_out.png")
;~ inpaint("mona_in.png", "mona_out.png")
;~ inpaint("maze_in.png", "maze_out.png")
;~ inpaint("checker_in.png", "checker_out.png")
เพียง uncomment ตัวอย่างที่คุณต้องการที่จะทำงานโดยใช้+CTRLQ
ไฟล์ทดสอบอย่างเป็นทางการ
อัลกอริทึมนี้ถูกสร้างขึ้นเพื่อปรับสำหรับแต่ละภาพ ดังนั้นค่าเริ่มต้น (และมาสก์เริ่มต้น) จึงไม่สมบูรณ์ เลือกค่าเริ่มต้นเพื่อให้ทุกตัวอย่างสามารถประมวลผลได้ในเวลาที่เหมาะสม ฉันขอแนะนำให้เล่นกับมาสก์ที่มีรูปร่างผิดปกติและขนาดของหน้าต่างที่ดีขึ้น คลิกที่ภาพเพื่อดูภาพขยาย!
กระดานหมากรุก
→
โกธิคอเมริกัน
→
เขาวงกต
→
Mona Lisa
→
(หน้ากากน่ากลัว)
กรี๊ด
→
แจ่มจรัส
→
ตัวอย่างโลกแห่งความจริง
เหล่านี้ทั้งหมดใช้มาสก์แบบวาดด้วยมือที่กำหนดเอง
หากคุณมีภาพที่น่าสนใจอื่น ๆ ที่คุณต้องการเห็นรวมไว้แสดงความคิดเห็น
การปรับปรุง EBII
EBII นั้นมีหลายสายพันธุ์ที่สร้างขึ้นโดยนักวิจัยหลายคน AnkurKumar Patelให้ความสนใจกับการรวบรวมเอกสาร[24]เกี่ยวกับการปรับปรุง EBII ต่างๆ
โดยเฉพาะกระดาษ " อัลกอริธึมที่ปรับปรุงแล้วที่มีประสิทธิภาพสำหรับภาพสีอิงจาก Exemplar " [25]กล่าวถึงการปรับปรุงสองอย่างเกี่ยวกับการชั่งน้ำหนักค่าลำดับความสำคัญ
การปรับปรุง
การปรับเปลี่ยนที่มีประสิทธิภาพอยู่ในขั้นตอนที่ 1 (ดูด้านบน) ของอัลกอริทึมและขยายเอฟเฟกต์C (p)และD (p)ในการจัดลำดับความสำคัญสำหรับพิกเซลนี้โดยใช้:
ในสูตรสำหรับCและD ที่ให้ไว้ด้านบนและเป็นปัจจัยการทำให้เป็นมาตรฐาน (เช่นα = 255), เวกเตอร์ isophote และเวกเตอร์หน่วยมุมฉากด้านหน้าด้านหน้าจุด p
เพิ่มเติม
ฟังก์ชั่นความสำคัญจะถูกกำหนดเป็นผลรวมน้ำหนักของ regularized ระยะความเชื่อมั่นC (P)และระยะข้อมูลใหม่D (P) โดยที่αคือค่าสัมประสิทธิ์การปรับค่า 0Rp (p) ที่น่าพอใจถูกกำหนดดังนี้
ที่αและβตามลำดับส่วนประกอบน้ำหนักของความเชื่อมั่นและข้อกำหนดของข้อมูล โปรดทราบว่าα + β = 1
คะแนนวัตถุประสงค์
สิ่งที่น่าสนใจจริงๆก็คือว่าบทความนี้มีวิธีที่เสนอ (และง่าย!) สำหรับการให้คะแนนประสิทธิภาพหากอัลกอริทึม EBII ใช้เวลานี้กับเม็ดเกลือแม้ว่าเป็นวิธีที่เลือกโดยผู้เขียนกระดาษตัวเองเพื่อตรวจสอบประสิทธิภาพของวิธีการแปรปรวนที่เสนอและการปรับปรุงในภาพหลายภาพ
การประเมินผลจะดำเนินการโดยการเปรียบเทียบ PSNR (อัตราส่วนสัญญาณต่อสัญญาณรบกวนสูงสุด[26] ) ระหว่างภาพที่ถูกเรียกคืนและภาพต้นฉบับ โดยทั่วไปค่า PSNR ที่สูงกว่าจะมีความคล้ายคลึงกันของภาพซ่อมแซมที่ใหญ่กว่าเดิม สมการในการคำนวณ PSNR มีดังนี้:
ภาพทดสอบในโลกแห่งความจริงอันตระการตา 2 (สอง!) เหล่านี้คือ:
บทสรุปนั้นน่าผิดหวังเหมือนคุณภาพของกระดาษเอง มันแสดงการปรับปรุงน้อยมาก สิ่งสำคัญที่นี่เป็นวิธีการให้คะแนนวัตถุที่เป็นไปได้สำหรับความท้าทายประเภทนี้ (และความท้าทายการซ่อมแซมภาพอื่น ๆ ):
+-------+---------------+----------+
| Image | EBII Original | Improved |
+-------+---------------+----------+
| 1 | 52.9556 | 53.7890 |
| 2 | 53.9098 | 53.8989 |
+-------+---------------+----------+
Meh
การวิจัยที่จะทำ
(เฉพาะ EBII)
a) การประมวลผลล่วงหน้า
ทุกอย่างมาถึงหลักการ "การลบ Magic" ที่อัลกอริทึมควร "ทำงานได้" สำหรับทุกสิ่ง คำตอบที่ไร้เดียงสาของฉันสำหรับสิ่งนี้คือแอมพลิฟายเออร์ตามสี (ดูด้านบน) แต่มีวิธีที่ดีกว่า ฉันกำลังคิดที่จะตระหนักถึงค่าเฉลี่ยทางเรขาคณิตของข้อความที่ติดตามได้ทั้งหมดเพื่อปรับขนาดหน้าต่างโดยอัตโนมัติและทำให้ขนาดแสตมป์ (รวมถึงการปรับปรุงของฉัน) ขึ้นอยู่กับความละเอียดของเท็กเซลและภาพทั้งหมด การวิจัยจะต้องทำที่นี่
b) การดำเนินการภายหลัง
ผู้แต่งดั้งเดิมทำงานได้ดีมากในการลบล้างตัวกรองการประมวลผลโพสต์ทั้งหมดที่คำนึง วันนี้ฉันลองอย่างอื่นโดยได้แรงบันดาลใจจากโมนาลิซาที่น่าประหลาดใจเสมอ ถ้าคุณใช้เวลาเพียงแค่ภูมิภาค inpainted และใช้หน้ากากใหม่เพื่อบล็อกแปลกทุกสีและให้อาหารที่เป็นอัลกอริทึม despeckling คุณจะเหลือผลที่เกือบจะสมบูรณ์แบบ ฉันอาจสำรวจบางครั้งในอนาคต
[X] - การกำจัดวัตถุโดย Inpainting จาก Exemplar โดย A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin การสังเคราะห์พื้นผิวธรรมชาติ ในพรอ. ACM Symp บนกราฟิก 3 มิติเชิงโต้ตอบหน้า 217–226, Research Triangle Park, NC, มี.ค. 2001
[5] - M. Bertalmio, L. Vese, G. Vese, G. Sapiro และ S. Osher โครงสร้างพร้อมกันและภาพพื้นผิว inpainting จะปรากฏ 2545
[6] - ร. Bornard อี. Lecan, L. Laborelli และ JH Chenot ไม่มีการแก้ไขข้อมูลในภาพนิ่งและลำดับภาพ ใน ACM Multimedia ประเทศฝรั่งเศส ธ.ค. 2545
[7] - TF Chan และ J. Shen การทาสีแบบไม่มีพื้นผิวโดยการกระจายความโค้ง (CDD) J. Visual Comm ภาพตัวแทน 4 (12), 2544
[8] - JS de Bonet ขั้นตอนการสุ่มตัวอย่างแบบหลายจุดสำหรับการวิเคราะห์และการสังเคราะห์ภาพพื้นผิว ในพรอ. ACM Conf คอมพ์ กราฟิก (SIGGRAPH) เล่ม 31, pp. 361–368, 1997
[9] - A. Efros และ WT Freeman ภาพ quilting สำหรับการสังเคราะห์พื้นผิวและการถ่ายโอน ในพรอ. ACM Conf คอมพ์ กราฟิก (SIGGRAPH), pp. 341–346, Eugene Fiume, ส.ค. 2001
[10] - A. Efros และ T. Leung การสังเคราะห์พื้นผิวโดยการสุ่มตัวอย่างแบบไม่มีพารามิเตอร์ ในพรอ. ICCV, pp 1576-1081, Kerkyra, กรีซ, ก.ย. 1999
[11] - WT อิสระ, EC Pasztor และ OT Carmichael การเรียนรู้การมองเห็นในระดับต่ำ int J. Computer Vision, 40 (1): 25–47, 2000
[12] - D. Garber แบบจำลองการคำนวณสำหรับการวิเคราะห์พื้นผิวและการสังเคราะห์พื้นผิว. วิทยานิพนธ์ปริญญาเอก, มหาวิทยาลัย ทางใต้ของแคลิฟอร์เนียสหรัฐอเมริกา 2524
[13] - พีแฮร์ริสัน ขั้นตอนที่ไม่เป็นลำดับชั้นสำหรับการสังเคราะห์พื้นผิวที่ซับซ้อนอีกครั้ง ในพรอ. int conf บริษัท ยุโรปกลาง กราฟิก, Visua และคอมพ์ วิสัยทัศน์, Plzen, สาธารณรัฐเช็ก, ก.พ. 2001
[14] - DJ Heeger และ JR Bergen การวิเคราะห์ / สังเคราะห์เนื้อพีระมิด ในพรอ. ACM Conf คอมพ์ กราฟิก (SIGGRAPH) เล่มที่ 29, pp. 229–233, ลอสแองเจลิส, แคลิฟอร์เนีย, 1995
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless และ D. Salesin การเปรียบเทียบภาพ ในพรอ. ACM Conf คอมพ์ กราฟิก (SIGGRAPH), Eugene Fiume, ส.ค. 2001
[16] - H. Igehy และ L. Pereira การแทนที่ภาพผ่านการสังเคราะห์พื้นผิว ในพรอ. int conf การประมวลผลภาพ, pp. III: 186–190, 1997.
[17] - G. Kanizsa องค์กรในวิสัยทัศน์ Praeger นิวยอร์ก 2522
[19] - แอล. เหลียง, ซีหลิว, วาย.-คิว Xu, B. Guo และ H.-Y Shum การสังเคราะห์พื้นผิวแบบเรียลไทม์โดยการสุ่มตัวอย่างด้วยแพทช์ ในธุรกรรม ACM บนกราฟิกส์ 2001
[22] - L.-W Wey และ M. Levoy การสังเคราะห์พื้นผิวอย่างรวดเร็วโดยใช้การแปลงเวกเตอร์เชิงโครงสร้างของต้นไม้ ในพรอ. ACM Conf คอมพ์ กราฟิก (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen และ L. van Gool การสังเคราะห์พื้นผิวคอมโพสิตแบบขนาน ในเนื้อ 2002 การประชุมเชิงปฏิบัติการ - (ร่วมกับ ECCV02), โคเปนเฮเกน, เดนมาร์ก, มิถุนายน 2002
[24] - AkurKumar เทลรัฐคุชราตมหาวิทยาลัยเทคโนโลยีวิทยาการคอมพิวเตอร์และวิศวกรรม
[25] - การปรับปรุงขั้นตอนวิธีการที่มีประสิทธิภาพสำหรับแบบอย่างตามภาพการจัดการระบบสี
[26] - Wikipedia, อัตราส่วนสัญญาณต่อเสียงรบกวน
inpaint.exe left top width height img.jpg
) ได้หรือไม่?