চিত্রটি প্যাচ করুন


114

একটি জনপ্রিয় ইমেজ এডিটিং সফটওয়্যার আছে একটি বৈশিষ্ট্য যা প্যাচ (মেয়াদ চিত্র প্রক্রিয়াকরণ ব্যবহৃত হয়, inpainting তথ্যের উপর ভিত্তি করে একটা ইমেজ একটি নির্বাচিত এলাকা হিসাবে @ mınxomaτ নির্দিষ্ট।), বাহিরে যে প্যাচ করুন। এবং এটি বেশ ভাল কাজ করে, এটি কেবল একটি প্রোগ্রাম হিসাবে বিবেচনা করে। একজন মানুষ হিসাবে আপনি মাঝে মাঝে দেখতে পান যে কিছু ভুল হয়েছে তবে আপনি যদি নিজের চোখটি চেপে ধরেন বা কেবল একবার তাকান তবে প্যাচটি পুরোপুরি ফাঁক হয়ে গেছে বলে মনে হচ্ছে ।

জনপ্রিয় চিত্র সম্পাদনা সফ্টওয়্যার দ্বারা উদাহরণস্বরূপ

চ্যালেঞ্জ

একটি চিত্র এবং একটি মুখোশ দেওয়া যা চিত্রের একটি আয়তক্ষেত্রাকার ক্ষেত্র নির্দিষ্ট করে প্যাচ করা উচিত (চিত্র হিসাবে বা অন্য কোনও পছন্দসই বিন্যাস হিসাবেও), আপনার প্রোগ্রামটি নির্দিষ্ট স্থানটিকে একটি প্যাচ দিয়ে পূরণ করার চেষ্টা করবে যা বাকী অংশগুলির সাথে মিশ্রণের চেষ্টা করে should চিত্র। প্রোগ্রামটি নির্দিষ্ট ক্ষেত্রের মধ্যে থাকা মূল চিত্রের তথ্য ব্যবহার করতে পারে না।

আপনি ধরে নিতে পারেন যে প্যাচটি সর্বদা কমপক্ষে প্রস্থ থেকে প্রস্থে থাকে এবং এটি উচ্চতা এবং চিত্রের নীচে থেকে দূরে থাকে। তার অর্থ একটি প্যাচের সর্বোচ্চ ক্ষেত্রফল পুরো চিত্রের 1/9।

আপনার অ্যালগরিদম কীভাবে কাজ করে সে সম্পর্কে একটি সংক্ষিপ্ত বিবরণ যুক্ত করুন।

ভোটিং

ভোটারদের অ্যালগরিদমগুলি কতটা ভাল সম্পাদন করে এবং সেই অনুযায়ী ভোট দেয় তা বিচার করতে বলা হয়।

কীভাবে বিচার করবেন সে সম্পর্কে কিছু পরামর্শ: (আবারও আরও কিছু মাপদণ্ডের জন্য ধন্যবাদ @ mınxomaτ।

  • আপনি যদি আপনার চোখ স্কুইন্ট করেন এবং ছবিটি ভাল দেখাচ্ছে?
  • প্যাচটি কোথায় তা আপনি বলতে পারবেন?
  • চিত্রের পটভূমি এবং আশেপাশের অঞ্চলগুলি থেকে কাঠামোগত কাঠামোগুলি কতটা ভাল চলছে?
  • সম্পাদিত এরিয়াতে কতটা বিপথগামী মিথ্যা রঙের পিক্সেল রয়েছে?
  • এই অঞ্চলে এমন কোনও রঙিন ব্লব / ব্লক রয়েছে যা দেখে মনে হয় না?
  • সম্পাদিত অঞ্চলে কি চিত্রের বাকী অংশের তুলনায় কোনও কঠোর রঙ / বৈসাদৃশ্য বা উজ্জ্বলতার শিফট রয়েছে?

বৈধতার মানদণ্ড

জমা দেওয়ার জন্য বৈধ হওয়ার জন্য, আউটপুট চিত্রটি অবশ্যই নির্দিষ্ট ক্ষেত্রের বাইরে ইনপুট চিত্রের সাথে অবশ্যই মিলবে।

পরীক্ষা ক্ষেত্রে

বাম দিকে উত্স চিত্রটি, ডানদিকে সংশ্লিষ্ট মাস্ক:


1
আমরা কি মুখোশের ইনপুটটিকে পাঠ্য আর্গুমেন্ট হিসাবে গ্রহণ করতে পারি (উদা। inpaint.exe left top width height img.jpg)?
mınxomaτ

1
অবশ্যই, ইনপুট / আউটপুট ফর্ম্যাটটি আসলে তেমন গুরুত্বপূর্ণ নয়, কারণ এটি একটি জনপ্রিয়তা প্রতিযোগিতা যেখানে আপনার অ্যালগরিদমের সমস্ত সম্পাদন প্রথমে গুরুত্বপূর্ণ।
flawr

24
এটি অত্যন্ত ব্যবহারিক চ্যালেঞ্জ। জিআইএমপি এবং অন্যান্য ওপেন সোর্স ইমেজ এডিটিং সফ্টওয়্যারটিতে ব্যবহৃত অ্যালগরিদমগুলির চেয়ে ফলাফলগুলি আরও ভাল হতে পারে। ভাগ্য, খ্যাতি এবং গৌরব আপনার হতে পারে!
স্পার

6
@ স্পার এবং অবশেষে কুরুচিপূর্ণ জলছবিগুলি ডাউনলোড করা মিডিয়া থেকে সরানো যেতে পারে;)
আন্দ্রেস ডেক

2
বিল্টিনগুলি পুরোপুরি ঠিক আছে, আমি সন্দেহ করি যে তারা যদিও খুব জনপ্রিয় হবে।
flawr

উত্তর:


142

অটোআইটি , ভিবি

ভূমিকা

এটি ক্রিমিনিসি , পি। পেরেজ (কেমব্রিজ মাইক্রোসফ্ট রিসার্চ লিমিটেড) এবং কে। তোয়ামা (মাইক্রোসফ্ট) [এক্স] দ্বারা বর্নিত উদাহরণমূলক ভিত্তিক ইনপেইন্টিং অ্যালগরিদম দ্বারা অবজেক্ট রিমুভালের একটি বাস্তবায়ন । এই অ্যালগরিদমটি উচ্চ-তথ্য চিত্রগুলিতে (এবং ভিডিও ফ্রেমগুলি) লক্ষ্যবস্তু এবং লক্ষ্যগত কাঠামোগত পুনর্গঠন এবং জৈব পুনর্গঠনের মধ্যে ভারসাম্য হ'ল। এই উত্তরটিকে আরও স্ব-অন্তর্ভুক্ত করার জন্য এই উত্তরের অনুচ্ছেদে মূল কাগজটির পুরো পাঠ্য উদ্ধৃতি রয়েছে (যেহেতু এটি আর সরকারীভাবে উপলব্ধ নেই)।

অ্যালগরিদম

লক্ষ্য : একটি নির্বাচিত ( মুখোশধারী ) অঞ্চল (সাধারণত একটি দৃষ্টি বিচ্ছিন্ন অগ্রভাগ অবজেক্ট) ভিজ্যুয়াল প্লাজেবল ব্যাকগ্রাউন্ডের সাথে প্রতিস্থাপন করুন ।

পূর্ববর্তী রচনায় বেশ কয়েকটি গবেষক টেক্সচার সংশ্লেষণকে বৃহত্তর চিত্র অঞ্চলগুলিকে "খাঁটি" টেক্সচার দিয়ে পূর্ণ করার উপায় হিসাবে বিবেচনা করেছেন - মাঝারি স্টোচাস্টিকটির সাথে পুনরাবৃত্তিযুক্ত দ্বি-মাত্রিক টেক্সারাল ধরণগুলি। এটি টেক্সচার-সংশ্লেষণ গবেষণার একটি বৃহত সংখ্যার উপর ভিত্তি করে তৈরি করা হয়েছে, যা খাঁটি অঙ্গবিন্যাসের একটি ছোট উত্সের নমুনা প্রদত্ত টেক্সচার অ্যাড ইনফিনিটামের প্রতিরূপ তৈরি করতে চায় [1] [8] [9] [10] [১১] [১২] [১৪] [15] [16] [19] [22]

এই কৌশলগুলি যেমন সামঞ্জস্যপূর্ণ জমিনের প্রতিরূপকরণে কার্যকর, ততই বাস্তব-বিশ্বের দৃশ্যের ফটোগ্রাফগুলিতে তাদের গর্ত পূরণ করতে অসুবিধা হয়, যা প্রায়শই রৈখিক কাঠামো এবং সংমিশ্রণ টেক্সচার সমন্বয়ে গঠিত - একাধিক টেক্সচার স্থানিকভাবে ইন্টারঅ্যাক্ট করে [23] । প্রধান সমস্যাটি হ'ল চিত্র অঞ্চলের মধ্যে সীমাগুলি বিভিন্ন টেক্সচারের মধ্যে পারস্পরিক প্রভাবগুলির একটি জটিল পণ্য। খাঁটি অঙ্গবিন্যাসের দ্বি-মাত্রিক প্রকৃতির বিপরীতে, এই সীমানাগুলি এমনটি গঠন করে যা আরও এক-মাত্রিক বা লিনিয়ার, চিত্র কাঠামো হিসাবে বিবেচিত হতে পারে।

ভাবমূর্তি inpainting কৌশল রৈখিক স্ট্রাকচার (যাকে বলা হয় বিস্তৃত হয়ে চিত্র গর্ত ভরাট isophotes মধ্যে inpainting আশ্লেষ মাধ্যমে সাহিত্য) লক্ষ্য অঞ্চলের মধ্যে। এগুলি শারীরিক তাপ প্রবাহের আংশিক ডিফারেনশিয়াল সমীকরণ দ্বারা অনুপ্রাণিত হয় এবং পুনরুদ্ধারের অ্যালগরিদম হিসাবে দৃinc়তার সাথে কাজ করে। তাদের ত্রুটিটি হ'ল প্রসারণ প্রক্রিয়াটি কিছু অস্পষ্টতার পরিচয় দেয়, যা লক্ষণীয়।

ডুমুর।  2

অঞ্চলটি পূরণ করা হবে, অর্থাত্, লক্ষ্য অঞ্চলটি by দ্বারা নির্দেশিত, এবং এর কনট্যুরকে চিহ্নিত করা হয়েছে δΩ কনট্যুরটি অ্যালগরিদমের অগ্রগতির সাথে সাথে অভ্যন্তরীণভাবে বিকশিত হয় এবং তাই আমরা এটিকে "ফিল ফ্রন্ট" হিসাবেও উল্লেখ করি। উত্স অঞ্চল, Φ, যা আলগোরিদিম জুড়ে স্থির থাকে, ফিলিং প্রক্রিয়াতে ব্যবহৃত নমুনা সরবরাহ করে। উদাহরণস্বরূপ-ভিত্তিক সংশ্লেষণ দ্বারা কাঠামো এবং টেক্সচারটি কীভাবে পর্যাপ্তভাবে পরিচালিত হয় তা দেখানোর জন্য আমরা এখন অ্যালগরিদমের একক পুনরাবৃত্তির দিকে মনোনিবেশ করি। মনে করুন যে বর্গক্ষেত্র টেমপ্লেট Ψp ∈ the বিন্দু পি (চিত্র 2 বি) কেন্দ্রিক, পূরণ করতে হবে। উত্স অঞ্চল থেকে সেরা ম্যাচের নমুনা প্যাচ Ψqˆ ∈ Φ থেকে আসে, যা ইতিমধ্যে partsp পূরণ করা অংশগুলির সাথে সাদৃশ্যপূর্ণ। ডুমুর উদাহরণে। 2 বি, আমরা দেখতে পাই যে Ψp যদি ইমেজ প্রান্তের ধারাবাহিকতায় থাকে, সর্বাধিক সম্ভবত সেরা ম্যাচগুলি একই (বা অনুরূপ রঙিন) প্রান্তের (যেমন, Ψq 'এবং'q' 'ডুমুরের 2c তে থাকবে) ধরে থাকবে। আইসোফোটের অভ্যন্তরীণ দিকে প্রচার করার জন্য যা কিছু প্রয়োজন তা হ'ল সেরা ম্যাচের উত্স প্যাচ (চিত্র 2 ডি) থেকে প্যাটার্নটির সরল স্থানান্তর। লক্ষ্য করুন যে আইসোফোট ওরিয়েন্টেশন স্বয়ংক্রিয়ভাবে সংরক্ষিত হয়েছে। চিত্রটিতে, মূল প্রান্তটি লক্ষ্য কনট্যুরের সাথে অরগানীয় নয় δΩ সত্ত্বেও, প্রচারিত কাঠামো উত্স অঞ্চলের মতো একই দিকনির্দেশনা বজায় রেখেছে।

বাস্তবায়ন এবং অ্যালগরিদম বিশদ

এই বাস্তবায়নের কার্যকারিতা একটি অ্যাক্টিভেক্স সিওএম ডিএলএলে আবদ্ধ হয় যা হোস্ট প্রোগ্রাম থেকে বাইনারি হিসাবে বাদ পড়ে এবং তারপরে আইআইডি দ্বারা ইনপেন্টারকে ফোন করে ফ্লাইতে ডাকা হয়। এই নির্দিষ্ট ক্ষেত্রে, এপিআই ভিজ্যুয়াল বেসে লেখা এবং যে কোনও সিওএম-সক্ষম ভাষা থেকে কল করা যেতে পারে। কোডের নিম্নলিখিত বিভাগটি বাইনারি ফেলেছে:

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

লাইব্রেরিটি পরে সিএলএসআইডি এবং আইআইডি ব্যবহার করে ইনস্ট্যান্ট করা হয়:

Local $hInpaintLib = DllOpen("inpaint.dll")
Local $oInpaintLib = ObjCreate("{3D0C8F8D-D246-41D6-BC18-3CF18F283429}", "{2B0D9752-15E8-4B52-9569-F64A0B12FFC5}", $hInpaintLib)

গ্রন্থাগারটি একটি জিডিআইওবিজেইসিটি হ্যান্ডেল গ্রহণ করে, বিশেষত কোনও জিডিআই / + বিটম্যাপ (ফাইল, স্ট্রিম ইত্যাদি) এর একটি ডিআইবিএসেকশন গ্রহণ করে। নির্দিষ্ট চিত্র ফাইলটি লোড করা হয় Scan0এবং ইনপুট চিত্রের মাত্রা থেকে নির্মিত একটি খালি বিটম্যাপে টানা হয় ।

এই বাস্তবায়নের জন্য ইনপুট ফাইলটি হ'ল মাস্কযুক্ত চিত্রের ডেটাযুক্ত কোনও জিডিআই / + সুসংগত ফাইল ফর্ম্যাট। মাস্ক (গুলি) ইনপুট ছবিতে এক বা একাধিক অবিশেষে রঙ্গিন অঞ্চলে হয়। ব্যবহারকারী মুখোশের জন্য একটি আরজিবি রঙের মান সরবরাহ করে, কেবলমাত্র রঙিন মানের সাথে পিক্সেল মেলানো হবে। ডিফল্ট মাস্কিংয়ের রঙ সবুজ (0, 255, 0)। সমস্ত মুখোশযুক্ত অঞ্চলগুলি একসাথে লক্ষ্য অঞ্চলকে উপস্থাপন করে, এবং, সরানো এবং পূরণ করা। উত্স অঞ্চল, Φ, লক্ষ্য অঞ্চল (Φ = I − Ω) হিসাবে পুরো চিত্র বিয়োগ হিসাবে সংজ্ঞায়িত করা হয়েছে।

এরপরে, সমস্ত আদর্শ-ভিত্তিক টেক্সচার সংশ্লেষণ [10] এর সাথে , টেম্পলেট উইন্ডো size (ওরফে " স্ক্যান ব্যাসার্ধ ") এর আকার অবশ্যই নির্দিষ্ট করতে হবে। এই বাস্তবায়নটি 6² পিক্সেলের একটি ডিফল্ট উইন্ডো আকার সরবরাহ করে, তবে বাস্তবে ব্যবহারকারীর উত্স অঞ্চলে এটি সবচেয়ে বড় স্বতন্ত্র টেক্সচার উপাদান বা "টেক্সেল" এর চেয়ে কিছুটা বড় হতে হবে। মূল অ্যালগরিদমের অতিরিক্ত পরিবর্তন হ'ল ব্যবহারকারী-সংজ্ঞাযোগ্য " ব্লক আকার " যা পিক্সেলগুলির ক্ষেত্রটি একটি নতুন ইউনিফর্ম রঙের সাথে প্রতিস্থাপন করা হবে তা নির্ধারণ করে। এটি গতি বাড়ে এবং গুণমান হ্রাস করে। 1px এর চেয়ে বেশি ব্লক আকারের জিটর বোঝানো হচ্ছে অত্যন্ত ইউনিফর্মযুক্ত অঞ্চল (জল, বালি, পশম ইত্যাদি) ব্যবহার করা উচিত, তবে Ψ সর্বোচ্চ রাখা উচিত। .5x ব্লকের আকার (যা মুখোশের উপর নির্ভর করে অসম্ভব হতে পারে)।

1 বিট চিত্রগুলিতে অ্যালগরিদম স্টল না করতে প্রতিবার 5 টিরও কম রঙের চিত্র পাওয়া গেলে উইন্ডোর আকার 10x দ্বারা প্রশস্ত করা হয়।

একবার এই প্যারামিটারগুলি নির্ধারণ করা হলে, অঞ্চল-পূরণের প্রক্রিয়াটির বাকি অংশগুলি সম্পূর্ণ স্বয়ংক্রিয়। আমাদের অ্যালগরিদমে, প্রতিটি পিক্সেল একটি রঙ মান (বা "খালি", যদি পিক্সেলটি ভরাট হয় না) এবং একটি আত্মবিশ্বাসের মান বজায় রাখে, যা পিক্সেল মানের প্রতি আমাদের আত্মবিশ্বাসকে প্রতিফলিত করে এবং যা পিক্সেল ভরা হয়ে গেলে হিমায়িত হয়। অ্যালগরিদম চলাকালীন, ফিল্ট ফ্রন্টের সাথে থাকা প্যাচগুলিকে একটি অস্থায়ী অগ্রাধিকারের মানও দেওয়া হয়, যা তারা পূরণ করা ক্রমটি নির্ধারণ করে। তারপরে, সমস্ত পিক্সেল পূরণ না হওয়া পর্যন্ত আমাদের অ্যালগরিদম নিম্নলিখিত তিনটি ধাপ পুনরাবৃত্তি করে।

পদক্ষেপ 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

কিছু পি ∈ for (চিত্র 3 দেখুন) এর জন্য বিন্দু পিতে কেন্দ্র করে একটি প্যাচ Ψp দেওয়া হয়েছে, এর অগ্রাধিকার পি (পি) গণনা করা আস্থা ( ComputeConfidenceবা সি (পি) ) এবং ডেটা টার্ম ( ComputeData, বা ডি (পি ), যেখানে

, কোথায়

| Ψp | Ψp এর ক্ষেত্রফল, Ψ একটি নরমালাইজেশন ফ্যাক্টর (যেমন, ধূসর ধরণের-স্তরের চিত্রের জন্য α = 255), এবং এনপি হ'ল একক ভেক্টর অরথোগোনাল is পয়েন্টের পয়েন্টে। অগ্রাধিকারটি প্রতিটি সীমানা প্যাচের জন্য লক্ষ্য অঞ্চলের সীমানায় প্রতিটি পিক্সেলের জন্য পৃথক প্যাচগুলির জন্য গণনা করা হয়।

হিসাবে কার্যকর করা হয়েছে

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

আত্মবিশ্বাসের শব্দটি সি (পি) পিক্সেল পি এর আশেপাশের নির্ভরযোগ্য তথ্যের পরিমাণ হিসাবে বিবেচনা করা যেতে পারে। অভিপ্রায়টি হ'ল প্রথমে যে প্যাচগুলি ইতিমধ্যে ভরা হয়েছে তাদের পিক্সেলগুলির আরও বেশি পিক্সেল পূরণ করা হবে, পিক্সেলগুলিকে অতিরিক্ত অগ্রাধিকার দেওয়া হবে যা তাড়াতাড়ি পূরণ করা হয়েছিল (বা এটি কখনই লক্ষ্য অঞ্চলের অংশ ছিল না)।

এটি স্বয়ংক্রিয়ভাবে পূরণের সামনের অংশে নির্দিষ্ট আকারের দিকে অগ্রাধিকার অন্তর্ভুক্ত করে। উদাহরণস্বরূপ, লক্ষ্য অঞ্চলের কোণগুলি এবং পাতলা টেন্ড্রিলগুলি অন্তর্ভুক্ত প্যাচগুলি প্রথমে পূরণ করা হবে, কারণ এগুলি মূল চিত্র থেকে আরও পিক্সেল দ্বারা বেষ্টিত রয়েছে। এই প্যাচগুলি আরও নির্ভরযোগ্য তথ্য সরবরাহ করে যার বিরুদ্ধে কোনটি মিলবে। বিপরীতে, আশেপাশের আরও বেশি পিক্সেল ভরাট না হওয়া পর্যন্ত পূর্ণ অঞ্চলে জঞ্জিত ভরাট পিক্সেলগুলির "উপদ্বীপ" এর ডগায় প্যাচগুলি আলাদা করে রাখা হবে a মোটা স্তরে প্রায় (1) এর সি (পি) শব্দটি রয়েছে approximately কাঙ্ক্ষিত মনোনিবেশ পূরণের আদেশ প্রয়োগ করে।

উপকরণ পূরণের সাথে সাথে লক্ষ্য অঞ্চলের বাইরের স্তরগুলিতে পিক্সেলগুলি বৃহত্তর আত্মবিশ্বাসের মানগুলির দ্বারা চিহ্নিত করা যায় এবং তাই পূর্বে পূরণ করা হবে; লক্ষ্য অঞ্চলের কেন্দ্রে অবস্থিত পিক্সেলগুলির আত্মবিশ্বাসের মান কম থাকবে। ডেটা শব্দটি ডি (পি) প্রতিটি পুনরাবৃত্তিতে সামনের দিকে আঘাত করা আইসোফোটের শক্তির একটি ফাংশন। এই পদটি একটি প্যাচটির অগ্রাধিকার বাড়ায় যা একটি আইসোফোট "প্রবাহিত" হয়। আমাদের অ্যালগরিদমে এই ফ্যাক্টরটি মৌলিক গুরুত্বের কারণ এটি লিনিয়ার স্ট্রাকচারকে প্রথমে সংশ্লেষিত করতে উত্সাহিত করে, এবং তাই নিরাপদভাবে লক্ষ্য অঞ্চলে প্রচার করা। ভাঙ্গা লাইনগুলি সংযোগ স্থাপন করে, ফলে দৃষ্টি মনোবিজ্ঞানের "সংযোগের মূলনীতি" উপলব্ধি করে []] [১]]

ফিল অর্ডারটি চিত্রের বৈশিষ্ট্যগুলির উপর নির্ভরশীল, যার ফলে একটি জৈব সংশ্লেষণ প্রক্রিয়া ঘটে যা "ভাঙ্গা-কাঠামো" শিল্পকর্মের ঝুঁকি দূর করে এবং ব্যয়বহুল প্যাচ কাটা পদক্ষেপ [9] বা একটি অস্পষ্ট-প্ররোচিত মিশ্রণ পদক্ষেপ ছাড়াই অবরুদ্ধ শিল্পকর্মকে হ্রাস করে [19] ]

পদক্ষেপ 2: জমিন এবং কাঠামোর তথ্য প্রচার

একবার ফিল ফ্রন্টের ( সীমানা ) সমস্ত অগ্রাধিকার গণনা করা হয়ে গেলে সর্বোচ্চ অগ্রাধিকার সহ প্যাচ Ψpˆ পাওয়া যায়। এরপরে আমরা উত্স অঞ্চল from থেকে প্রাপ্ত ডেটা দিয়ে এটি পূরণ করি Φ আমরা উত্স অঞ্চলের সরাসরি নমুনা দ্বারা চিত্রের জমিন প্রচার করি। [10] এর অনুরূপ , আমরা সেই প্যাচটির উত্স অঞ্চলে অনুসন্ধান করি যা Ψpˆ এর সাথে সাদৃশ্যপূর্ণ আনুষ্ঠানিকভাবে,

, কোথায়

দুটি জেনেরিক প্যাচ Ψa এবং Ψb এর মধ্যে দূরত্ব d (Ψa, )b) কেবল দুটি প্যাচে ইতিমধ্যে ভরাট পিক্সেলের স্কোয়ার পার্থক্য (এসএসডি) এর যোগফল হিসাবে সংজ্ঞায়িত করা হয়েছে। এই পদক্ষেপে আর কোনও বিশ্লেষণ বা কারসাজি করা ( বিশেষত কোনও ঝাপসা হওয়া ) করা হয় না। এই গণনাটি মূল চক্র লুপে চলে এবং নিম্নলিখিত হিসাবে প্রয়োগ করা হয়:

সর্বাধিক অগ্রাধিকার পাওয়া:

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ˆ নতুন পিক্সেল মানগুলি পূর্ণ হওয়ার পরে, thepˆ দ্বারা সীমিত আকারে আত্মবিশ্বাস সি (পি) আপডেট করা হয়েছে:

এই সাধারণ আপডেটের নিয়মটি চিত্র-নির্দিষ্ট পরামিতিগুলি ছাড়াই, ফিলফ্রন্টের প্যাচগুলির আপেক্ষিক আত্মবিশ্বাস পরিমাপ করতে দেয়। ফিলিংয়ের পরিমাণ বাড়ার সাথে সাথে আত্মবিশ্বাসের মানগুলি ক্ষয় হয়, ইঙ্গিত করে যে আমরা লক্ষ্য অঞ্চলের কেন্দ্রের কাছে পিক্সেলের রঙের মান সম্পর্কে কম নিশ্চিত are এখানে প্রয়োগ করা হয়েছে (অন্যান্য সমস্ত প্রয়োজনীয় আপডেটের সাথে):

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")

আপনি CTRL+ ব্যবহার করে যে উদাহরণটি চালাতে চান তা কেবল অস্বীকার করুন Q

অফিসিয়াল টেস্ট ফাইল

এই অ্যালগরিদম হয় প্রণীত প্রতিটি ইমেজ জন্য স্থায়ী করা হবে। অতএব, ডিফল্ট মানগুলি (এবং এটিও ডিফল্ট মুখোশগুলি) সম্পূর্ণ suboptimal। ডিফল্ট মানগুলি বেছে নেওয়া হয় যাতে প্রতিটি নমুনা যুক্তিসঙ্গত সময়ে প্রক্রিয়া করা যায়। আমি অনিয়মিত আকারের মুখোশ এবং আরও ভাল উইন্ডো আকারের সাথে খেলতে সুপারিশ করি। চিত্রগুলি বড় করতে ক্লিক করুন!

ছক

আমেরিকান গথিক

ধাঁধা

মোনালিসা

(ভয়ানক মুখোশ)

চিত্কার

তারকাময়

বাস্তব-বিশ্ব উদাহরণ

এই সমস্ত কাস্টম হাতে আঁকা মুখোশ ব্যবহার।

আপনার যদি অন্তর্ভুক্ত দেখতে আগ্রহী অন্যান্য আকর্ষণীয় চিত্র থাকে তবে একটি মন্তব্য করুন।

EBII উন্নতি

বিভিন্ন গবেষক দ্বারা তৈরি EBII এর একাধিক রূপ রয়েছে। অঙ্কুর কুমার প্যাটেল তাঁর কাগজপত্র সংগ্রহের সাথে আমার দৃষ্টি আকর্ষণ করেছিলেন [২৪] বিভিন্ন ইবিআইআইয়ের উন্নতিতে।

বিশেষত কাগজটিতে " উদাহরণস্বরূপ চিত্রের জন্য উন্নত রবস্ট অ্যালগরিদম " [25] অগ্রাধিকারের মানগুলির ওজন সম্পর্কে দুটি উন্নতির উল্লেখ করেছে।

উন্নতি

কার্যকর পরিবর্তনটি অ্যালগরিদমের প্রথম ধাপে (উপরে দেখুন) রয়েছে এবং এটি ব্যবহার করে এই পিক্সেলের জন্য অগ্রাধিকার রেটিংটিতে সি (পি) এবং ডি (পি) প্রভাবটি প্রসারিত করে :

উপরে বর্ণিত সি এবং ডি এর সূত্রে এবং যথাক্রমে নরমালাইজেশন ফ্যাক্টর (যেমন, α = 255), আইসোফোট ভেক্টর এবং ইউনিট ভেক্টর অরথোগোনালটি পয়েন্ট পয়েন্টে সামনের দিকে।

উপরন্তু,

অগ্রাধিকার ফাংশনটি নিয়মিত আত্মবিশ্বাসের শব্দ সি (পি) এবং নতুন ডেটা টার্ম ডি (পি) এর ওজন যোগফল হিসাবে সংজ্ঞায়িত হয় । যেখানে α হ'ল সমন্বয় সহগ, সন্তোষজনক 0 আরপি (পি) নীচে সংজ্ঞায়িত করা হয়:

যেখানে respectively এবং respectively যথাক্রমে আত্মবিশ্বাসের ওজন এবং ডেটার শর্তাবলীর উপাদান। নোট করুন যে α + β = 1

উদ্দেশ্য স্কোরিং

তবে সত্যিই আকর্ষণীয় বিষয়টি হ'ল ইবিআইআই অ্যালগরিদম যদি এই কাগজটিতে পারফরম্যান্স স্কোর করার জন্য প্রস্তাবিত (এবং সাধারণ!) পদ্ধতি রয়েছে। যদিও লবণের দানার সাথে এটি নিন, কারণ প্রস্তাবিত বৈকল্পিক পদ্ধতির কার্যকারিতা এবং বেশ কয়েকটি চিত্রের উন্নতি যাচাই করার জন্য এটি কাগজ লেখকরা নিজেরাই বেছে নিয়েছেন।

পুনরুদ্ধারকৃত চিত্র এবং মূল চিত্রের মধ্যে পিএসএনআর (পিক সিগন্যাল থেকে নয়েজ অনুপাত [২ 26]] তুলনা করে ফলাফল মূল্যায়ন সম্পাদন করা হয় । সাধারণভাবে পিএসএনআর মানটি যতটা বেশি মেরামত করা ইমেজের মিলের সাথে তত বেশি। পিএসএনআর গণনা করার সমীকরণটি নিম্নরূপ:

এগুলি হ'ল তারা (2!) বাস্তব-বিশ্বের পরীক্ষামূলক চিত্রগুলি ব্যবহার করেছে:

উপসংহারটি কাগজের নিজেই মানের হিসাবে হতাশাজনক। এটি খুব সামান্য উন্নতি দেখায়। এখানে মূল বিষয় হ'ল এই ধরণের চ্যালেঞ্জের (এবং অন্যান্য চিত্র-মেরামতের চ্যালেঞ্জগুলি) জন্য একটি সম্ভাব্য অবজেক্ট স্কোরিং পদ্ধতি:

+-------+---------------+----------+
| Image | EBII Original | Improved |
+-------+---------------+----------+
|     1 |       52.9556 |  53.7890 |
|     2 |       53.9098 |  53.8989 |
+-------+---------------+----------+

সাধরণ।

গবেষণা করা হবে

(ইবিআইআই-তে নির্দিষ্ট)

ক) প্রাক প্রক্রিয়াজাতকরণ

সবকিছুই "ম্যাজিক ইরেজ" নীতিতে নেমে আসে যে অ্যালগরিদমটি প্রতিটি কিছুর জন্য "কেবল" কাজ করা উচিত। এর জন্য আমার নিষ্পাপ সমাধানটি রঙ-ভিত্তিক প্রশস্তকরণ (উপরে দেখুন), তবে আরও ভাল উপায় রয়েছে। আমি উইন্ডো আকারটি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে টেক্সেল- এবং পুরো চিত্রের রেজোলিউশনের উপর নির্ভর করে স্ট্যাম্পের আকারটি (আমার উন্নতিও) তৈরি করতে সমস্ত ট্রেসযোগ্য টেক্সেলের জ্যামিতিক গড়টি স্বীকৃতি দেওয়ার কথা ভাবছি । গবেষণা এখানে করতে হবে।

খ) পোস্ট-প্রসেসিং

মূল লেখকরা ইতিমধ্যে মনে রাখা সমস্ত পোস্ট প্রসেসিং ফিল্টার ডিবাঙ্ক করার একটি দুর্দান্ত কাজ করেছেন। সর্বদা অস্বাভাবিক মোনা লিসা (ধন্যবাদ আন্ডারগ্রাউন্ডোমোরাইল) দ্বারা অনুপ্রাণিত হয়ে আমি আজ অন্য কিছু চেষ্টা করেছি tried আপনি যদি কেবল ইনপেন্টেড অঞ্চলটি নিয়ে যান এবং রঙের সমস্ত অদ্ভুত ব্লকগুলিতে একটি নতুন মাস্ক প্রয়োগ করেন এবং এটি হতাশাকৃত অ্যালগরিদমে ফিড করে থাকেন তবে আপনি প্রায় নিখুঁত ফলাফল রেখে গেছেন। ভবিষ্যতে আমি এটি কিছু সময় অন্বেষণ করতে পারি।


[এক্স] - এ। ক্রিমিনিসি, পি। পেরেজ, কে। তোয়ামা
[1] - এম আশিখমিনের দ্বারা উদাহরণমূলক ভিত্তিক ইনপেইন্টিং দ্বারা অবজেক্ট অপসারণপ্রাকৃতিক জমিন সংশ্লেষ। প্রোকে। এসিএম সিম্প। ইন্টারেক্টিভ 3 ডি গ্রাফিক্স, পৃষ্ঠা 217-2226, রিসার্চ ট্রায়াঙ্গেল পার্ক, এনসি, মার্চ ২০০১
. যুগপত স্ট্রাকচার এবং টেক্সচার ইমেজ ইনপেন্টিং। উপস্থিত হতে, ২০০২
[]] - আর বর্নার্ড, ই। লেকান, এল। লেবোরেলি এবং জেএইচ। Chenot। স্থির চিত্র এবং চিত্রের ক্রমগুলিতে ডেটা সংশোধন অনুপস্থিত। ফ্রান্সের এসিএম মাল্টিমিডিয়াতে, ডিসেম্বর 2002.
[]] - টিএফ চ্যান এবং জে শেন। বক্রতা-চালিত বিস্তৃতকরণ (সিডিডি) দ্বারা অ টেক্সচার ইনপেন্টিং। জে ভিজুয়াল কম। চিত্র রেপ।, 4 (12), 2001।
[8] - জেএস ডি বোনেট। টেক্সচার ইমেজের বিশ্লেষণ এবং সংশ্লেষণের জন্য মাল্টিরেসোলিউশন স্যাম্পলিং পদ্ধতি। প্রোকে। এসিএম কনফারেন্স বন্দীরা। গ্রাফিক্স (সিগগ্রাফ), খণ্ড 31, পৃষ্ঠা 361–368, 1997.
[9] - এ। এফ্রোস এবং ডব্লিউটি ফ্রিম্যান। টেক্সচার সংশ্লেষণ এবং স্থানান্তরের জন্য চিত্র Quilting। প্রোকে। এসিএম কনফারেন্স বন্দীরা। গ্রাফিক্স (সিগ্রাগ্রাফ), পৃষ্ঠা 341–346, ইউজিন ফিউম, আগস্ট 2001.
[10] - এ। এফ্রোস এবং টি লেউং। নন-প্যারামেট্রিক স্যাম্পলিং দ্বারা টেক্সচার সংশ্লেষণ। প্রোকে। আইসিসিভি, পিপি। 1033381038, কেরকিরা, গ্রীস, সেপ্টেম্বর 1999.
[11] - ডব্লিউটি ফ্রিম্যান, ইসি পাস্জটার এবং ওটি কারমাইকেল। নিম্ন স্তরের দৃষ্টি শিখছি। আইএনটি। জে কম্পিউটার ভিশন, 40 (1): 25–47, 2000.
[12] - ডি গারবার। টেক্সচার অ্যানালাইসিস এবং টেক্সচার সংশ্লেষণের জন্য গণনামূলক মডেল। পিএইচডি থিসিস, ইউনিভ। দক্ষিণ ক্যালিফোর্নিয়া, মার্কিন যুক্তরাষ্ট্র, 1981।
[13] - পি। হ্যারিসন জটিল জমিনের পুনঃসংশ্লেষণের জন্য একটি অ -ক্রমিক প্রক্রিয়া। প্রোকে। আইএনটি। কনফারেন্স। মধ্য ইউরোপ কমপ্লেক্স। গ্রাফিক্স, ভিসুয়া। এবং কমপ্লেক্স। ভিশন, প্লাজেন, চেক প্রজাতন্ত্র, ফেব্রুয়ারী ২০০১।
[১৪] - ডিজে হিগার এবং জেআর বার্গেন। পিরামিড ভিত্তিক টেক্সচার বিশ্লেষণ / সংশ্লেষণ। প্রোকে। এসিএম কনফারেন্স বন্দীরা। গ্রাফিক্স (সিগ্রাগ্রাফ), খণ্ড ২৯, পৃষ্ঠা 229–233, লস অ্যাঞ্জেলেস, সিএ, 1995.
[15] - এ হার্টজম্যান, সি জ্যাকবস, এন। অলিভার, বি কার্লস, এবং ডি সেলসিন। চিত্র উপমা। প্রোকে। এসিএম কনফারেন্স বন্দীরা। গ্রাফিক্স (সিগগ্রাফ), ইউজিন
ফিউম , আগস্ট 2001. [16] - এইচ। ইগহে এবং এল পেরেইরা। টেক্সচার সংশ্লেষণের মাধ্যমে চিত্র প্রতিস্থাপন। প্রোকে। আইএনটি। কনফারেন্স। চিত্র প্রক্রিয়াকরণ, পৃষ্ঠা III: 186–190, 1997.
[17] - জি কানিজসা। ভিশনে সংস্থা। প্রেগার, নিউ ইয়র্ক, 1979
[19] - এল। লিয়াং, সি লিউ, ওয়াই- কিউ। শু, বি। গুও এবং এইচ.ওয়াই। Shum। প্যাচ ভিত্তিক নমুনা দ্বারা রিয়েল-টাইম টেক্সচার সংশ্লেষণ। গ্রাফিক্সের এসিএম লেনদেনগুলিতে, 2001.
[22] - এল.ডব্লিউ ওয়ে এবং এম। লেভয়। গাছের কাঠামোগত ভেক্টর কোয়ান্টাইজেশন ব্যবহার করে দ্রুত টেক্সচার সংশ্লেষণ। প্রোকে। এসিএম কনফারেন্স বন্দীরা। গ্রাফিকস (সিগগ্রাফ), 2000.
[২৩] - এ। জালসেনি, ভি। ফেরারি, জি। কেনেন, এবং এল ভ্যান গল। সমান্তরাল যৌগিক জমিন সংশ্লেষণ। টেক্সচার 2002 ওয়ার্কশপে - (ইসিসিভি02 এর সাথে একত্রে), কোপেনহেগেন, ডেনমার্ক, জুন 2002.
[২৪] - আকুরকুমার প্যাটেল, গুজরাট টেকনোলজিকাল ইউনিভার্সিটি, কম্পিউটার সায়েন্স অ্যান্ড ইঞ্জিনিয়ারিং
[২৫] - উদাহরণস্বরূপ ইমেজ ইনপেন্টিংয়ের জন্য উন্নত রবস্ট অ্যালগরিদম
[২ 26] - উইকিপিডিয়া, শিখর-সিগন্যাল থেকে নয়েজ-অনুপাত


30
এটা দুর্দান্ত । স্টারি নাইট তাই ভাল। তবুও, সেই মোনা লিসা ...
হ্যানস কার্পিলা

8
প্রথমে আমাকে বলি "ওহে আমার godশ্বর এটি অবিশ্বাস্য"। দ্বিতীয়: আমি ইতিমধ্যে এখানে অন্য প্রশ্নের বিষয়ে "দ্য মোনা লিসা কিছু এসসিপি ছি ছি" মন্তব্য করেছেন, তবে সেই পেঁচা আসলে এমন কিছু দেখায় যা এসসিপি উইকিতে প্রদর্শিত হতে পারে।
আন্ডারগ্রাউন্ডোমোরাইল

3
আপনি উল্লিখিত অনুচ্ছেদগুলিকে কোট ব্লক করা যেতে পারে?
ট্রাইকোপলাক্স

1
@ থ্রিচোপ্লেক্স প্রায় প্রতিটি বাক্যেই ছোটখাট পরিবর্তন হয়, সেগুলি যথাযথ উদ্ধৃতি নয়। Org হিসাবে একই অ্যালগরিদম বর্ণনা বিবেচনা করুন। কাগজ যখন এটি পরিবর্তন বা কোড বলে except আমি আর আর ফর্ম্যাট করতে চাই না :)
ম্যাক্সোমাτ

2
আমি যখন আমার স্বপ্নগুলিতে খুব মনোযোগ সহকারে কিছু দেখার চেষ্টা করি তখন কখনও কখনও জিনিসগুলি ঠিক এরকম হয়ে যায়।
jimmy23013

45

মতলব

এটি একটি সাধারণ অন্তরঙ্গকরণ পদ্ধতির। প্যাচটির প্রতিটি দিকে কী রয়েছে তা ধারণাটি প্রথমে মিরর করে দিচ্ছে। তারপরে এই আয়না চিত্র পিক্সেলগুলি সংযুক্ত প্রান্তের সাথে কতটা কাছাকাছি হয় তা দ্বারা বিভক্ত হয়:

ছদ্মবেশী অংশটি একটি দুর্দান্ত দোল ওজন খুঁজে পেয়েছিল। কিছুটা খেলার পরে আমি একটি যুক্তিযুক্ত ফাংশন নিয়ে এসেছি যা আমরা যেখানে মিরর করেছি সেখানে ব্যতীত সমস্ত প্রান্তে শূন্য। এটি পরে কিছু স্মুথিংয়ের জন্য তৃতীয় ডিগ্রি বহুবর্ষ দ্বারা রূপান্তরিত হয়:

এই সহজ পদ্ধিতিটি "প্রাকৃতিক" চিত্রগুলিতে আশ্চর্যজনকভাবে ভাল করে তোলে, তবে আপনি যখন তীক্ষ্ণ প্রান্তগুলির মুখোমুখি হবেন, খেলা শেষ হয়ে গেল। ইন আমেরিকান গথিক উদাহরণ খড় কাঁটাচামচ লাইন আপ চমত্কারভাবে পিক্সেল গ্রিডে, যা এটা বেশ সুন্দর দেখাচ্ছে তোলে সঙ্গে স্পাইক, কিন্তু এটা অনেক খারাপ অন্যথায় হত।

সুতরাং এখানে ফলাফল:

এবং পরিশেষে, কোড:

imgfile= 'filename.png';
maskfile = [imgfile(1:end-4),'_mask.png'];
img = double(imread(imgfile));
mask = rgb2gray(imread(maskfile));
%% read mask
xmin = find(sum(mask,1),1,'first');
xmax = find(sum(mask,1),1,'last');
ymin = find(sum(mask,2),1,'first');
ymax = find(sum(mask,2),1,'last');
%% weight transformation functiosn
third = @(x)-2* x.^3 + 3* x.^2;
f=@(x)third(x);
w=@(x,y)y.*(x-1).*(y-1)./( (x+y).*(x+1-y));

for x=xmin:xmax
    for y=ymin:ymax
        %Left Right Up Down;
        P = [img(y,xmin-(x-xmin)-1,:);img(y,xmax+(xmax-x)+1,:);img(ymin-(y-ymin)-1,x,:);img(ymax+(ymax-y)+1,x,:)];
        % normalize coordinates
        rx = (x-xmin)/(xmax-xmin); 
        ry = (y-ymin)/(ymax-ymin);
        % calculate the weights
        W = [w(rx,ry),w(1-rx,ry),w(ry,rx),w(1-ry,rx)]';
        W = f(W);
        W(isnan(W))=1;
        img(y,x,:) = sum(bsxfun(@times,P,W),1)/sum(W); 
    end
end
imshow(img/255);
imwrite(img/255,[imgfile(1:end-4),'_out.png']);

10
মোনা লিসা আমাকে লুটিয়ে চলেন।
আন্দ্রেস ডেক

46
̢̎̓̀Ǹ̰͎̣͙o̢̎̓̀ǹ̰͎̣͙a̤̩̖̞̝ͧ̈ͤͤ ͉̻̭͌L͉̻̭͌i̛̥͕̱͋͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ
mınxomaτ

8
সেই মোনা লিসা হলেন কিছু এসসিপি বিষ্ঠা
আন্ডারগ্রাউন্ডোমোনাইল

1
চেক করা চিত্রটি দেখতে দুর্দান্ত আইএমএইচও।
ETH প্রোডাকশনগুলি

1
আপনি যদি নিজের চ্যালেঞ্জ এটি দিয়ে জিতেন তবে আমি অবাক হব না। এটি একটি দুর্দান্ত সমাধান।
অ্যালেক্স এ।

25

ম্যাথামেটিকাল

এটি ম্যাথমেটিকার Inpaintফাংশন ব্যবহার করে। ম্যাথমেটিকা ​​নিজেই সমস্ত ভারী উত্তোলন করে, কারণ এটি একটি সম্প্রদায় উইকি।

inPaint(নীচে) এর একটি সাধারণ অভিযোজন Inpaint। রঙিন পেইন্টিং / ফটোগুলির জন্য এটি ডিফল্ট, "টেক্সচারস সিন্থেসিস", সেটিং ব্যবহার করে। যদি এটি সনাক্ত করে যে ছবিটি কালো এবং সাদা (কারণ চিত্রের চিত্রের তথ্য চিত্রের বাইনারি ফর্মের চিত্রের ডেটা হিসাবে একই) তবে এটি চিত্রটিকে দ্বির্মুখী করে এবং "টোটাল ভ্যারিয়েশন" প্যাচ প্রয়োগ করে। Ifদফা পারেন প্রযোজ্য Binarizeবা Identityছবি। ( Identityফাংশনটি তার যুক্তিটি অপরিবর্তিত রেখে দেয়))

inPaint[picture_, mask_] :=  
 If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@
  Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]

চিত্র এবং মুখোশটি যুক্তি হিসাবে প্রবেশ করা হয়েছে inPaintPartitionএবং Gridকেবল বিন্যাসের উদ্দেশ্যে।

ইনপুট

আউটপুট প্যাচ করা হয়েছে। এর পরে চিত্রগুলির কোনও পুনর্নির্মাণ ছিল না inPaint

আউটপুট


4
এটি একটি কাকতালীয় ঘটনা হতে পারে, তবে আমি গোলকধাঁধার অভিনয় দেখে অবাক!
flawr

1
@ ফ্লোয়ার আমি এই সমাধানটির সাথে ঝামেলা করার জন্য এই জাতীয় কিছু ফেলেছিলাম ;) (কে জানে? এই কালো-সাদারা সত্যই বিস্মিত হয়))
আন্দ্রেস ডেক

17
আমি মনে করি না এটি একটি সম্প্রদায়ের উইকি হওয়া উচিত।
ডেনিস

লর, হ্যাঁ, Inpaintপুরো কালো এবং সাদা চিত্র জুড়ে প্রতিসাম্যগুলি সন্ধান করছে বলে মনে হচ্ছে। - ডেভিডসি 9 ঘন্টা আগে
ডেভিডসি

আপনি কি নিশ্চিত যে কালো-সাদা অ্যালগরিদম কোথাও ছাগল বলিদান জড়িত না? কিভাবে --- পৃথিবীতে --- এটি চিত্রের কেন্দ্রীয় কাঠামোটি অনুমান করে, যদি এটি সমস্ত মুখোশযুক্ত থাকে তবে ??
Andras Deak

18

পাইথন 2 এবং পিআইএল

এই প্রোগ্রামটি স্থানীয় চিত্রের অঞ্চল থেকে রঙ, টেক্সচার এবং শেড ব্যবহার করে প্রতিস্থাপনের পিক্সেল তৈরি করতে উত্তর, দক্ষিণ, পূর্ব এবং পশ্চিম অঞ্চলের অনুলিপিগুলিকে মিশ্রিত করে।

উদাহরণ ফলাফল:

কোডটি প্রথমে প্যাচের জন্য বাউন্ডিং বক্সটি সন্ধান করে। তারপরে প্রতিটি পিক্সেল উত্পন্ন করার জন্য, এটি চারটি পার্শ্ববর্তী অঞ্চলের ওজনফলের ভিত্তিতে প্রতিটি চ্যানেলের (আরজিবি) রঙের গণনা করে।

import sys
from PIL import Image

infile, maskfile, outfile = sys.argv[1:4]
imageobj = Image.open(infile)
maskobj = Image.open(maskfile)
image = imageobj.load()
mask = maskobj.load()

assert imageobj.size == maskobj.size
W, H = imageobj.size
pixels = [(x,y) for x in range(W) for y in range(H)]
whitepart = [xy for xy in pixels if sum(mask[xy]) > 230*3]
xmin = min(x for x,y in whitepart)
xmax = max(x for x,y in whitepart)
ymin = min(y for x,y in whitepart)
ymax = max(y for x,y in whitepart)
xspan = xmax - xmin + 1
yspan = ymax - ymin + 1

def mkcolor(channel):
    value = image[(xmin-dx, y)][channel] * 0.5*(xspan - dx)/xspan
    value += image[(xmax+1 + xspan - dx, y)][channel] * 0.5*dx/xspan
    value += image[(x, ymin-dy)][channel] * 0.5*(yspan - dy)/yspan
    value += image[(x, ymax+1 + yspan - dy)][channel] * 0.5*dy/yspan
    return int(value)

for dx in range(xspan):
    for dy in range(yspan):
        x = xmin + dx
        y = ymin + dy
        image[(x, y)] = (mkcolor(0), mkcolor(1), mkcolor(2))

imageobj.save(outfile)

3
এই মোনা লিসাও আতঙ্কজনক! এই চ্যালেঞ্জের সমস্ত মোনা লিসাস কি ভীতিপ্রদ হয়ে যাওয়ার চেষ্টা করছে ??
আন্ডারগ্রাউন্ডোমোনাইল

@ندرগ্রাউন্ডোমোরিয়েল আমার ধারণা, কম্পিউটার-উত্পাদিত দুর্ঘটনার মুখগুলি অবাস্তব উপত্যকার গভীর থেকে আসে ।
আন্দ্রেস ডেক

আপনি কোথা থেকে পিআইএল পাবেন?
এলিয়ট এ।

@ElliotA। আমার উপলব্ধি হ'ল পিআইএল যথাযথ মারা গেছে তবে এটি ওপেন সোর্স ছিল এবং তাই এটি "বালিশ" নামে বাস করে। আপনি যদি "পাইথন বালিশ" গুগল করেন তবে আপনার এটি খুঁজে পাওয়া উচিত।
আন্ডারগ্রাউন্ডোমোরাইল

13

পাইথন 3, পিআইএল

এই প্রোগ্রামটি সোবল অপারেটর ব্যবহার করে এবং এর উপর ভিত্তি করে চিত্রটিতে লাইন আঁকবে।

সোবল অপারেটর প্রতিটি প্রান্তের কোণ খুঁজে পায়, তাই অজানা অঞ্চলে প্রস্থান করা যে কোনও প্রান্তটি চালিয়ে যাওয়া উচিত।

from PIL import Image, ImageFilter, ImageDraw
import time
im=Image.open('2.png')
im1=Image.open('2 map.png')
a=list(im.getdata())
b=list(im1.getdata())
size=list(im.size)
'''
def dist(a,b):
    d=0
    for x in range(0,3):
        d+=(a[x]-b[x])**2
    return(d**0.5)
#'''
C=[]
d=[]
y=[]
for x in range(0,len(a)):
    if(b[x][0]==255):
        C.append((0,0,0))
    else:
        y=(a[x][0],a[x][1],a[x][2])
        C.append(y)
im1.putdata(C)
k=(-1,0,1,-2,0,2,-1,0,1)
k1=(-1,-2,-1,0,0,0,1,2,1)
ix=im.filter(ImageFilter.Kernel((3,3),k,1,128))
iy=im.filter(ImageFilter.Kernel((3,3),k1,1,128))
ix1=list(ix.getdata())
iy1=list(iy.getdata())
d=[]
im2=Image.new('RGB',size)
draw=ImageDraw.Draw(im2)
c=list(C)
Length=0
for L in range(100,0,-10):
    for x in range(0,size[0]):
        for y in range(0,size[1]):
            n=x+(size[0]*y)
            if(c[n]!=(0,0,0)):
                w=(((iy1[n][0]+iy1[n][1]+iy1[n][2])//3)-128)
                z=(((ix1[n][0]+ix1[n][1]+ix1[n][2])//3)-128)
                Length=(w**2+z**2)**0.5
                if Length==0:
                    w+=1
                    z+=1
                Length=(w**2+z**2)**0.5
                w/=(Length/L)
                z/=(Length/L)
                w=int(w)
                z=int(z)
                draw.line(((x,y,w+x,z+y)),c[n])

d=list(im2.getdata())
S=[]
d1=[]
A=d[0]
for x in range(0,size[0]):
    for y in range(0,size[1]):
        n=y+(size[1]*x)
        nx=y+(size[1]*x)-1
        ny=y+(size[1]*x)-size[0]
        if d[n]==(0,0,0):
            S=[0,0,0]
            for z in range(0,3):
                S[z]=(d[nx][z]+d[ny][z])//2
            #print(S)
            d1.append(tuple(S))
        else:
            d1.append(tuple(d[n]))
d=list(d1)
im2.putdata(d)
#im2=im2.filter(ImageFilter.GaussianBlur(radius=0.5))
d=im2.getdata()
f=[]
#'''
for v in range(0,len(a)):
    if(b[v][0]*b[v][1]*b[v][2]!=0):
        f.append(d[v])
    else:
        f.append(C[v])
#'''
im1.putdata(f)
im1.save('pic.png')

এদিকে, এখানে নমুনা চিত্রগুলি দেওয়া আছে।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

মোনা লিসা মোনালিসা লিসা

এখানে চিত্র বর্ণনা লিখুন উপরের চিত্রের অঞ্চলটি ক্যাকটাসের মতোই মসৃণ

ধ্রুব রঙ সহ এটি খুব ভাল নয়।

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


1
ওহ, এবং আপনি দয়া করে বি / ডাব্লু পরীক্ষার কেস যুক্ত করতে পারেন?
flawr

2
স্টারারি নাইট একটিতে সত্যিই দুর্দান্ত লাগছে।
সুপারজেডি ২৪

1
বাহ, এটি এখন অবিশ্বাস্য দেখাচ্ছে! প্যাচগুলি এখনও লক্ষণীয় তবে দুর্দান্ত ধারণা! আমার প্রিয় এখন পর্যন্ত =)
flawr

8
"মোনা লিসা মোনা লিসা Ḿ͠oǹ̰͎̣a ̾̇Lisa Ḿ͠o̢̎̓̀ǹ̰͎̣aͧ̈ͤ isa লিসা Ḿ̳̜͇͓͠o̢̎̓̀ǹ̰͎̣͙a̤̩̖̞̝ͧ̈ͤͤ ͉̻̭͌L͉̻̭͌i̛̥͕̱͋͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ" এর জন্য +1
mbomb007

2
আপনি আইএমওতে "ভয়ানক মোনা লিসা" প্রতিযোগিতা জিতেছেন। 0_o
DLosc 20'17

8

পাইথন 2

সরল পাইথন স্ক্রিপ্ট যা ফাঁকের ঠিক বাইরে পিক্সেল থেকে মান ব্যবহার করে প্যাচ তৈরি করে। এটি পিক্সেলের সারি এবং কলামের শেষ থেকে রঙের মান নেয় এবং p পিক্সেল থেকে দূরত্ব ব্যবহার করে ওজনিত গড় গণনা করে।

আউটপুট এত সুন্দর নয়, তবে এটি শিল্প

img1 img2 img3 img4 img5 img6

এবং তারপরে, কোড:

IMGN = "6"

IMGFILE = "images/img%s.png" % (IMGN,)
MASKFILE = "images/img%s_mask.png" % (IMGN,)

BLUR = 5


def getp(img,pos):
    return img.get_at(pos)[:3]
def setp(img,pos,color):
    img.set_at(pos, map(int, color))

def pixelavg(L):
    return map(int, [sum([i[q] for i in L])/float(len(L)) for q in [0,1,2]])
def pixelavg_weighted(L, WL):   # note: "inverse" weights. More weight => less weight
    # colors [sum, max]
    color_data = [[0, 0], [0, 0], [0, 0]]
    for color,weight in zip(L, WL):
        for i in [0, 1, 2]: # r,g,b
            color_data[i][0] += inv_w_approx(weight) * color[i]
            color_data[i][1] += inv_w_approx(weight) * 255
    return [255*(float(s)/m) for s,m in color_data]
def inv_w_approx(x):
    return (1.0/(x+1e-10))

import pygame
image = pygame.image.load(IMGFILE)
mask = pygame.image.load(MASKFILE)

size = image.get_size()
assert(size == mask.get_size())

# get square from mask
min_pos = None
max_pos = [0, 0]
for x in range(size[0]):
    for y in range(size[1]):
        if getp(mask, [x, y]) == (255, 255, 255):
            if min_pos == None:
                min_pos = [x, y]
            max_pos = [x, y]
if not min_pos:
    exit("Error: no mask found.")
# patch area info
patch_position = min_pos[:]
patch_size = [max_pos[0]-min_pos[0], max_pos[1]-min_pos[1]]

# remove pixels from orginal image (fill black)
for dx in range(patch_size[0]):
    for dy in range(patch_size[1]):
        setp(image, [patch_position[0]+dx, patch_position[1]+dy], [0, 0, 0])

# create patch
patch = pygame.Surface(patch_size)

# take pixels around the patch
top = [getp(image, [patch_position[0]+dx, patch_position[1]-1]) for dx in range(patch_size[0])]
bottom = [getp(image, [patch_position[0]+dx, patch_position[1]+patch_size[1]+1]) for dx in range(patch_size[0])]
left = [getp(image, [patch_position[0]-1, patch_position[1]+dy]) for dy in range(patch_size[1])]
right = [getp(image, [patch_position[0]+patch_size[0]+1, patch_position[1]+dy]) for dy in range(patch_size[1])]

cpixels = top+left+right+bottom

# set area to average color around it
average = [sum([q[i] for q in cpixels])/float(len(cpixels)) for i in [0, 1, 2]]

for dx in range(patch_size[0]):
    for dy in range(patch_size[1]):
        setp(patch, [dx, dy], average)

# create new pixels
for dx in range(patch_size[0]):
    for dy in range(patch_size[1]):
        setp(patch, [dx, dy], pixelavg_weighted([top[dx], bottom[dx], left[dy], right[dy]], [dy, patch_size[1]-dy, dx, patch_size[0]-dx]))

# apply patch
for dx in range(patch_size[0]):
    for dy in range(patch_size[1]):
        setp(image, [patch_position[0]+dx, patch_position[1]+dy], getp(patch, [dx, dy]))

# blur patch?
for r in range(BLUR):
    for dx in range(patch_size[0]):
        for dy in range(patch_size[1]):
            around = []
            for ddx in [-1,0,1]:
                for ddy in [-1,0,1]:
                    around.append(getp(image, [patch_position[0]+dx+ddx, patch_position[1]+dy+ddy]))
            setp(patch, [dx, dy], pixelavg(around))

    # apply blurred patch
    for dx in range(patch_size[0]):
        for dy in range(patch_size[1]):
            setp(image, [patch_position[0]+dx, patch_position[1]+dy], getp(patch, [dx, dy]))

# save result
pygame.image.save(image, "result.png")

এই মুহুর্তে আপনি সেই অনুভূমিক / উল্লম্ব স্ট্রাইপগুলি দেখতে পাচ্ছেন, সম্ভবত আপনি অন্যান্য দিকগুলি অন্তর্ভুক্ত করে এটি উন্নত করতে পারেন!
flawr

আমি আসলে এটি চেষ্টা করেছিলাম, তবে আমি ভাল ফলাফল পেতে অক্ষম ছিলাম, তাই আমি ঠিক ঠিক করেছি ইমেজটি অস্পষ্ট করার জন্য: ডি
হ্যানস কার্পিলা

19
অবশেষে, একটি মোনালিসা যে নেই আমাকে প্রস্তরবর্ষণে হত্যা না ভীতি, কিন্তু এর পরিবর্তে একটি গ্রেফতার খুনী মত দেখায়।
আন্দ্রেস ডেক

6

ম্যাথামেটিকাল

Inpaint

এটি ঠিক তাই ঘটে যে ম্যাথামেটিকার একটি অন্তর্নির্মিত ফাংশন থাকে যা ঠিক এই কাজটি সম্পাদন করে, এবং আমার অর্থ হ'ল :

Inpaint[image, region]

  • অংশগুলি retouches imageমধ্যে অশূন্য উপাদান যে মিলা region

ডিফল্টরূপে এটি "বেস্ট-ফিট টেক্সচার সংশ্লেষণ পদ্ধতিটি এলোমেলো নমুনা ব্যবহার করে" ব্যবহার করে যা পেইন্টিংগুলিতে ভাল ফলাফল দেয়, তবে গোলকধাঁধা এবং চেকবোর্ডের জন্য খারাপ ফলাফল:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

সেটিংসটি নিয়ে ঘুরে বেড়ানো আমার সমস্ত চিত্র জুড়ে গুণমানের বৃদ্ধি করতে পারেনি, তাই আমি স্রেফ ডিফল্টগুলি ব্যবহার করেছি (বাইটগুলি বাঁচাতে - এটি codegolf.seসর্বোপরি!)।


23
" এমনটিই ঘটে যে ম্যাথামেটিকায় একটি অন্তর্নির্মিত ফাংশন থাকে " ... অবাক, আশ্চর্য;)
আন্দ্রেস ডেক

গোলকধাঁধা এবং চেকার বোর্ডের জন্য Binarize(ধূসর ধূমপান দূর করতে) পাশাপাশি "টোটাল ভ্যারিয়েশন" পদ্ধতিটি ব্যবহার করা আরও ভাল । এটি চেষ্টা করুন: methods = {"TextureSynthesis", "Diffusion", "FastMarching", "NavierStokes", "TotalVariation"};g[pic_, mask_] := Join[{Labeled[Framed@pic, "Original"]}, Labeled[ Binarize@Inpaint[pic, mask, Method -> #], #] & /@ methods]
ডেভিডসি

@ ডেভিডসি আমি অন্যান্য পদ্ধতিগুলি চেষ্টা করেছিলাম, তবে কেবল TextureSynthesisচিত্রগুলিতেই ভাল দেখাচ্ছে; এবং আমি মনে করি না যে প্রতিটি পৃথক পরীক্ষার ক্ষেত্রে আমাদের সেটিংস টিউন করার অনুমতি দেওয়া হয়েছে। (যদি আমরা পারতাম তবে তুচ্ছভাবে একটি 'সেটিং' হিসাবে নিখোঁজ অংশটি সরবরাহ করতে পারতাম))
২০১২

গোলকধাঁধা এবং চেকবোর্ডের ফলাফলগুলি সত্যিই আমার কাছে বিস্মিত। গায়েবি অঞ্চলের গণিতের পুনর্গঠন কেন এত অনিয়মিত এবং অসম্পূর্ণ?
ডেভিড জাং

এটি কোনও চিত্র কালো এবং সাদা কিনা তা স্বয়ংক্রিয়ভাবে সনাক্ত করবে এবং উপযুক্ত সামঞ্জস্য করবে (বাইনারি এবং "টোটাল ভ্যারিয়েশন" পদ্ধতি)। inPaint[picture_, mask_] := If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@ Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]
ডেভিডসি

5

Python3

এই উত্তরটি উলিয়ানভ এট আল-র "ডিপ ইমেজ প্রাইমার" পত্রিকায় ধারণাটি কার্যকর করে । (সিভিপিআর 2018) এই গবেষণাপত্রে তারা এই ধারণাটি অন্বেষণ করেছেন যে চিত্র প্রক্রিয়াকরণের জন্য নিউরাল নেটগুলি যেভাবে ভালভাবে সম্পাদন করা হয়েছে তা প্রাকৃতিক চিত্রটি কেমন হওয়া উচিত ("পূর্ববর্তী" বিতরণ) আমাদের ধারণাটি প্রতিবিম্বিত করে।

তারা এমন একটি পদ্ধতির প্রস্তাব করেছিলেন যা শব্দদান এবং শৈল্পিক অপসারণের পাশাপাশি ইনপেনটিংয়ের জন্য ব্যবহার করা যেতে পারে যা প্রদত্ত চিত্রটিকে অন্য কোনও ডেটা সম্পর্কে কোনও প্রশিক্ষণ ছাড়াই ব্যবহার করে। আসল ধারণাটি বেশ সহজ: নেটকে কোনও নির্দিষ্ট মুখোশের বাইরে কেবল এররগুলিকে শাস্তি দিয়ে কাঙ্ক্ষিত চিত্রটি (কিছু নির্দিষ্ট এলোমেলো শব্দ হিসাবে ইনপুট হিসাবে) আউটপুট দেওয়ার প্রশিক্ষণ দেওয়া হয়। আপনি যদি শব্দটি মুছে ফেলতে চান তবে আপনার কোনও কিছু মুখোশ করার দরকার নেই, তবে প্রশিক্ষণ শুরু করার আগেই থামুন।

ইনপেন্টিংয়ের জন্য আপনি যে অংশটি ইনপেইন্ট করতে চান তা মাস্ক করুন এবং কনভার্সেশন পর্যন্ত প্রশিক্ষণ দিন। এটি অবশ্যই অত্যাধুনিক নয়, তবে ধারণার সরলতা এবং এখনও উল্লেখযোগ্য পারফরম্যান্সের কারণে আমি এখনও চেষ্টা করে দেখতে এবং এটি এখানে পোস্ট করতে চেয়েছিলাম। আমার পরীক্ষায় বৃহত্তর প্যাচগুলির সংযোজন যে ভালভাবে পরিণত হয়নি তবে ছোট বিভাগগুলির জন্য ফলাফলগুলি অনেক বেশি বিশ্বাসযোগ্য হতে পারে।

আমি গিথুবের জ্যাক্সনি থেকে জনপ্রিয় ইউ-নেট আর্কিটেকচারটি ব্যবহার করে এটি বাস্তবায়ন করেছি । চিত্রগুলি প্রশিক্ষণ এবং প্রসেসিংয়ের কোডটি নীচে পাওয়া যাবে।

প্রশিক্ষণ

এটি প্রশিক্ষণ প্রক্রিয়াটির একটি দৃশ্যায়ন। প্রতিটি ফ্রেম হল একটি নির্দিষ্ট সংখ্যক পুনরাবৃত্তির রাজ্যের মধ্যস্থল:

উদাহরণ

কোড

মনে রাখবেন যে একটি সিপিইউতে এটি কেবল একটি একক চিত্রের জন্য দৌড়াতে কয়েক ঘন্টা সময় নিতে পারে, যখন একটি ভাল চুদা সক্ষম জিপিইউ অনেক কম সময় নিতে পারে।

import torch
import numpy as np
unet = __import__('unet-pytorch')
import PIL.ImageOps
#specify device (cpu/cuda)
device = "cpu"
#specify file and size
file = 'mona'
size = 512 #pad to this size (no smaller than original image), must be divisible by 2^5
img_pil = PIL.Image.open(file +'.png').convert('RGB')
mask_pil = PIL.Image.open(file +'-mask.png').convert('RGB')

net = unet.UNet(num_classes=3, in_channels=32, depth=6, start_filts=64).to(device)
h,w = img_pil.size
pad = (0, 0, size - h, size - w)
img = PIL.ImageOps.expand(img_pil, border=pad)
img = torch.Tensor(np.array(img).transpose([2, 0, 1])[None, :, :, :].astype(np.double)).to(device)
mask = PIL.ImageOps.expand(mask_pil, border=pad)
mask = torch.Tensor((np.array(mask)==0).transpose([2, 0, 1])[None, 0:3, :, :].astype(np.double)).to(device)
mean = img.mean()
std = img.std()
img = (img - mean)/std
optimizer = torch.optim.Adam(net.parameters(), lr=0.0001)
criterion = torch.nn.MSELoss()
input = torch.rand((1, 32, size, size)).to(device)
for it in range(5000):
    if it == 1000:
        optimizer.param_groups[0]['lr'] = 0.00003
    out = net(input)
    loss = criterion(out * mask, img * mask)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
out = out.detach().cpu().numpy()[0].transpose([1,2,0])*std.item() + mean.item()
out = np.clip(out, 0, 255).astype(np.uint8)[0:w, 0:h, :]
mask_np = (np.array(mask_pil) > 0).astype(np.uint8)
img_np = np.array(img_pil)
inpaint = (img_np * (1-mask_np) + mask_np * out).astype(np.uint8)
PIL.Image.fromarray(inpaint).save('./{}_inpainted.png'.format(file))

ডিপ ইমেজ অগ্রাধিকার কি ইউ-নেট থেকে আলাদা কিছু ব্যবহার করে? দেখে মনে হচ্ছে তারা আরও ভাল ফলাফল পেতে চাইবে
ASCII- কেবল

এছাড়াও, আপনি কি ডিপ ইমেজ প্রাইনের কোড দিয়ে চেষ্টা করেছেন
এএসসিআইআই-কেবল

@ এএসসিআইআই কেবল তারা কাগজে লিখিত আছে যে তারা প্রকৃতপক্ষে ইউ-নেট ব্যবহার করে তবে আমি তাদের সঠিক পরামিতিগুলি খুঁজে পাই না। তারা বৃহত্তর ক্ষমতা সহ নেট ব্যবহার করতে পারে। আমার কাছে কেবলমাত্র খুব সীমিত পরিমাণে বিদ্যুত সহ একটি কম্পিউটার ছিল। সুতরাং আমাকে এমন প্যারামিটারগুলি বেছে নিতে হয়েছিল যা এখনও মেমরির সাথে ফিট করে এবং এটি ট্রেন করতে খুব বেশি সময় নেয় না। আমি নিশ্চিত না যে এটি ঠিক কতটা সময় নিয়েছে তবে আমি যে কম্পিউটারে ব্যবহার করেছি (কেবলমাত্র একটি সিপিইউ দিয়েছি) এই চিত্রগুলি একাধিক দিন সময় নেয়। (যদি আপনার কাছে অতিরিক্ত চুদা সক্ষম থাকে তবে জিপিইউ আমাকে জানাতে হবে :)
flawr

আমি আরও সন্দেহ করি যে নেটওয়ার্কের নকশার কারণে আয়তক্ষেত্রাকার মুখোশগুলিও আদর্শ নয় (এবং ছোট মুখোশগুলি সম্ভবত আরও ভাল দেখায়), যদি আপনি উদাহরণস্বরূপ প্রথম দুটি চিত্রকে শেষ দুটিতে তুলনা করেন (যা আয়তক্ষেত্রাকার মুখোশ ব্যবহার করে না) ।
flawr

4

ওপেনসিভি সহ পাইথন

ওপেনসিভিতে ইনপেন্ট নামে একটি ফাংশন রয়েছে। দুই ধরণের ইনপেনটিং ব্যবহার করা হয়েছে, আমি ফাস্ট মার্চিং পদ্ধতিটি ব্যবহার করব। ডকুমেন্টেশন অনুসারে, অ্যালগরিদম এইভাবে কাজ করে:

প্রতিচ্ছবিযুক্ত করতে চিত্রের একটি অঞ্চল বিবেচনা করুন। অ্যালগরিদম এই অঞ্চলের সীমানা থেকে শুরু হয় এবং এই অঞ্চলের অভ্যন্তরে ধীরে ধীরে প্রথমে সমস্ত কিছু সীমানায় পূরণ করে। সংক্ষিপ্তসার স্থাপনের জন্য পিক্সেলের চারপাশে এটি ছোট্ট প্রতিবেশ লাগে। এই পিক্সেলটি নেগবুরহুডে সমস্ত জ্ঞাত পিক্সেলের সাধারণ মানের ওজনযুক্ত যোগফল দ্বারা প্রতিস্থাপিত হয়েছে। ওজন নির্বাচন একটি গুরুত্বপূর্ণ বিষয়। সীমানার স্বাভাবিকের কাছাকাছি অবস্থিত এবং সীমানা সংলগ্ন স্থানে থাকা পিক্সেলগুলিকে আরও ওজন দেওয়া হয় একবারে পিক্সেল ইনপেইন্ট করা হয়ে গেলে এটি দ্রুত মার্চিং পদ্ধতিটি ব্যবহার করে পরবর্তী নিকটতম পিক্সেলের দিকে চলে যায়। এফএমএম নিশ্চিত করে যে পিক্সেলগুলি জানা পিক্সেলের নিকটে রয়েছে প্রথমে ইনপেন্ট করা হয়েছে, যাতে এটি কেবল ম্যানুয়াল হিউরিস্টিক অপারেশনের মতো কাজ করে।

এখানে কোড *:

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('gothic.jpg')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
mask = cv2.imread('mask.jpg',0)
dst = cv2.inpaint(img2,mask,3,cv2.INPAINT_TELEA)
(h, w) = dst.shape[:2]
center = (w / 2, h / 2)
# rotate the image by 180 degrees
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated = cv2.warpAffine(dst, M, (w, h))
plt.imshow(rotated)

নোট করুন কীভাবে আমি পরিকল্পনার কারণে বিজিআরকে আরজিবিতে রূপান্তর করি এছাড়াও, আমি এটি ঘোরান। ফলাফল এখানে:

গোথিক

তারকাময় রাত চিত্কার আর এক চতুর মোনা লিসা!

মোনা লিসা ফিরলেন!

লাইন 1

পরীক্ষক

আপনি দেখতে পাচ্ছেন, দুটি রঙের সাথে এটি আমি সেরা না।


মোনা লিসা একটি ফেসলিফট পেয়েছেন
কনর ও'ব্রায়েন

3

জাভা

একটি রঙ গড় পদ্ধতির। সম্ভবত উন্নতি করা যেতে পারে।

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Scanner;

import javax.imageio.ImageIO;


public class ImagePatcher{
    public static void main(String[]args) throws Exception{
        Scanner in=new Scanner(System.in);
        int white=Color.WHITE.getRGB();
        int black=Color.BLACK.getRGB();
        BufferedImage image=ImageIO.read(new File(in.nextLine())),mask=ImageIO.read(new File(in.nextLine()));
        assert(image.getWidth()==mask.getWidth()&&image.getHeight()==mask.getHeight());
        boolean bool=true;
        while(bool){
            bool=false;
        for(int x=0;x<image.getWidth();x+=2){
            for(int y=0;y<image.getHeight();y+=2){
                if(mask.getRGB(x,y)!=white)continue;
                int r=0,g=0,b=0,n=0;
                for(int dx=-1;dx<=1;dx++){
                    if(x+dx<0)continue;
                    if(x+dx>=image.getWidth())continue;
                    for(int dy=-1;dy<=1;dy++){
                        if(y+dy<0)continue;
                        if(y+dy>=image.getHeight())continue;
                        if(mask.getRGB(x+dx,y+dy)==white)continue;
                        Color c=new Color(image.getRGB(x+dx,y+dy));
                        r+=c.getRed();
                        g+=c.getGreen();
                        b+=c.getBlue();
                        n++;
                    }
                }
                if(n==0){bool=true;continue;}
                Color c=n>0?new Color(r/n,g/n,b/n):new Color(100,100,100);
                image.setRGB(x,y,c.getRGB());
                mask.setRGB(x, y, black);
            }           
        }
        for(int x=0;x<image.getWidth();x+=2){
            for(int y=1;y<image.getHeight();y+=2){
                if(mask.getRGB(x,y)!=white)continue;
                int r=0,g=0,b=0,n=0;
                for(int dx=-1;dx<=1;dx++){
                    if(x+dx<0)continue;
                    if(x+dx>=image.getWidth())continue;
                    for(int dy=-1;dy<=1;dy++){
                        if(y+dy<0)continue;
                        if(y+dy>=image.getHeight())continue;
                        if(mask.getRGB(x+dx,y+dy)==white)continue;
                        Color c=new Color(image.getRGB(x+dx,y+dy));
                        r+=c.getRed();
                        g+=c.getGreen();
                        b+=c.getBlue();
                        n++;
                    }
                }
                if(n==0){bool=true;continue;}
                Color c=n>0?new Color(r/n,g/n,b/n):new Color(100,100,100);
                image.setRGB(x,y,c.getRGB());
                mask.setRGB(x, y, black);
            }
        }
        for(int x=1;x<image.getWidth();x+=2){
            for(int y=0;y<image.getHeight();y+=2){
                if(mask.getRGB(x,y)!=white)continue;
                int r=0,g=0,b=0,n=0;
                for(int dx=-1;dx<=1;dx++){
                    if(x+dx<0)continue;
                    if(x+dx>=image.getWidth())continue;
                    for(int dy=-1;dy<=1;dy++){
                        if(y+dy<0)continue;
                        if(y+dy>=image.getHeight())continue;
                        if(mask.getRGB(x+dx,y+dy)==white)continue;
                        Color c=new Color(image.getRGB(x+dx,y+dy));
                        r+=c.getRed();
                        g+=c.getGreen();
                        b+=c.getBlue();
                        n++;
                    }
                }
                if(n==0){bool=true;continue;}
                Color c=n>0?new Color(r/n,g/n,b/n):new Color(100,100,100);
                image.setRGB(x,y,c.getRGB());
                mask.setRGB(x, y, black);
            }           
        }
        for(int x=1;x<image.getWidth();x+=2){
            for(int y=1;y<image.getHeight();y+=2){
                if(mask.getRGB(x,y)!=white)continue;
                int r=0,g=0,b=0,n=0;
                for(int dx=-1;dx<=1;dx++){
                    if(x+dx<0)continue;
                    if(x+dx>=image.getWidth())continue;
                    for(int dy=-1;dy<=1;dy++){
                        if(y+dy<0)continue;
                        if(y+dy>=image.getHeight())continue;
                        if(mask.getRGB(x+dx,y+dy)==white)continue;
                        Color c=new Color(image.getRGB(x+dx,y+dy));
                        r+=c.getRed();
                        g+=c.getGreen();
                        b+=c.getBlue();
                        n++;
                    }
                }
                if(n==0){bool=true;continue;}
                Color c=n>0?new Color(r/n,g/n,b/n):new Color(100,100,100);
                image.setRGB(x,y,c.getRGB());
                mask.setRGB(x, y, black);
            }
        }
        };
        ImageIO.write(image, "png", new File("output.png"));
    }
}

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


2
আপনি কেন সর্বদা এই নির্দিষ্ট কোণে লাইন পান? উপরের বাম কোণগুলি তুলনামূলকভাবে ভাল মিলছে বলে মনে হচ্ছে, যখন নীচের ডান অংশটি একেবারেই মেলে না।
flawr

আমি মনে করি যে অঞ্চলটি দিয়ে আমি পুনরাবৃত্তি করি তার সাথে এটির সম্পর্কযুক্ত। আমি সম্ভবত শেষ পর্যন্ত পরিবর্তন করব।
সুপারজেডি ২৪

এটি সর্বদা দেখে মনে হয় ট্র্যাপিজয়েড রয়েছে।
ericw31415

@ ericw31415 এটি পুনরাবৃত্তি ক্রমের একটি নিদর্শন।
সুপারজেডি ২২৪
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.