উত্তর:
আনসার্প মাস্কিংয়ের বিষয়ে উইকিপিডিয়া নিবন্ধে একটি সাধারণ পদ্ধতি নির্ধারণ করা হয়েছে :
আপনি একটি গাউসিয়ান স্মুথিং ফিল্টার ব্যবহার করেন এবং মূল চিত্র থেকে স্মুটেড সংস্করণটি বিয়োগ করুন (একটি ওজনযুক্ত উপায়ে যাতে একটি ধ্রুবক অঞ্চলের মান স্থির থাকে)।
একটি নিশিত সংস্করণ পেতে frame
মধ্যে image
: (উভয় cv::Mat
)
cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);
আপনার নিজের জন্য সামঞ্জস্য করার জন্য এমন কিছু প্যারামিটার রয়েছে।
ল্যাপ্লেসিয়ার তীক্ষ্ণতা রয়েছে, যখন আপনি গুগল করেন তখন আপনাকে তার উপর কিছু খুঁজে পাওয়া উচিত।
আপনি একটি সাধারণ কার্নেল এবং ফিল্টার 2 ডি ফাংশন চেষ্টা করতে পারেন , যেমন পাইথনে:
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
im = cv2.filter2D(im, -1, kernel)
উইকিপিডিয়ায় এখানে আরও কয়েকটি উদাহরণ সহ কার্নেলের একটি ভাল ওভারভিউ রয়েছে - https://en.wikedia.org/wiki/Kernel_(image_processing)
চিত্র প্রক্রিয়াকরণে, একটি কার্নেল, কনভলিউশন ম্যাট্রিক্স বা মাস্ক একটি ছোট ম্যাট্রিক্স। এটি অস্পষ্ট, তীক্ষ্ণকরণ, এম্বসিং, প্রান্ত সনাক্তকরণ এবং আরও অনেক কিছুতে ব্যবহৃত হয়। এটি কার্নেল এবং একটি চিত্রের মধ্যে একটি সমঝোতা করে সম্পন্ন হয়।
আপনি প্রায় একটি নমুনা কোড জানতে পারেন ব্যবহার "মুখোশটি" অ্যালগরিদম ইমেজ ধার এ OpenCV ডকুমেন্টেশন ।
মান পরিবর্তন sigma
, threshold
, amount
ভিন্ন ফলাফল দেবে।
// sharpen image using "unsharp mask" algorithm
Mat blurred; double sigma = 1, threshold = 5, amount = 1;
GaussianBlur(img, blurred, Size(), sigma, sigma);
Mat lowContrastMask = abs(img - blurred) < threshold;
Mat sharpened = img*(1+amount) + blurred*(-amount);
img.copyTo(sharpened, lowContrastMask);
আপনি একটি অসম্পূর্ণ মাস্ক ব্যবহার করে একটি চিত্র তীক্ষ্ণ করতে পারেন । আনসার্প মাস্কিং সম্পর্কে আপনি এখানে আরও তথ্য পেতে পারেন । এবং এখানে ওপেনসিভি ব্যবহার করে একটি পাইথন বাস্তবায়ন রয়েছে:
import cv2 as cv
import numpy as np
def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0):
"""Return a sharpened version of the image, using an unsharp mask."""
blurred = cv.GaussianBlur(image, kernel_size, sigma)
sharpened = float(amount + 1) * image - float(amount) * blurred
sharpened = np.maximum(sharpened, np.zeros(sharpened.shape))
sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape))
sharpened = sharpened.round().astype(np.uint8)
if threshold > 0:
low_contrast_mask = np.absolute(image - blurred) < threshold
np.copyto(sharpened, image, where=low_contrast_mask)
return sharpened
def example():
image = cv.imread('my-image.jpg')
sharpened_image = unsharp_mask(image)
cv.imwrite('my-sharpened-image.jpg', sharpened_image)
amount
কেবল তীক্ষ্ণ পরিমাণ। উদাহরণস্বরূপ, amount
০.০ এর একটি ডিফল্ট মান ০.০ এর তুলনায় একটি তীক্ষ্ণ চিত্র দেয়। threshold
নিম্ন-বিপরীতে মাস্কের জন্য প্রান্তিকতা। অন্য কথায়, যে পিক্সেলগুলির জন্য ইনপুট এবং অস্পষ্ট চিত্রগুলির মধ্যে পার্থক্য threshold
অপরিবর্তিত থাকবে।
যে কোনও চিত্র হ'ল বিভিন্ন ফ্রিকোয়েন্সি সংকেতের সংগ্রহ। উচ্চতর ফ্রিকোয়েন্সিগুলি প্রান্তগুলি নিয়ন্ত্রণ করে এবং নিম্ন ফ্রিকোয়েন্সি চিত্রের সামগ্রীকে নিয়ন্ত্রণ করে। যখন একটি পিক্সেল মান থেকে অন্যান্য পিক্সেল মানের নিকটবর্তী ঘরে 0 এবং 255 এর মত তীক্ষ্ণ রূপান্তর হয় তখন প্রান্তগুলি গঠিত হয়। স্পষ্টতই একটি তীব্র পরিবর্তন আছে এবং তাই প্রান্ত এবং উচ্চ ফ্রিকোয়েন্সি। কোনও চিত্রকে তীক্ষ্ণ করার জন্য এই রূপান্তরগুলি আরও বাড়ানো যেতে পারে।
একটি উপায় হ'ল চিত্রের সাথে একটি স্ব-নির্মিত ফিল্টার কার্নেলকে বোঝানো।
import cv2
import numpy as np
image = cv2.imread('images/input.jpg')
kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
sharpened = cv2.filter2D(image, -1, kernel) # applying the sharpening kernel to the input image & displaying it.
cv2.imshow('Image Sharpening', sharpened)
cv2.waitKey(0)
cv2.destroyAllWindows()
চিত্রের ঝাপসা সংস্করণ এর উজ্জ্বল সংস্করণ থেকে বিয়োগ করার আরও একটি পদ্ধতি রয়েছে। এটি চিত্রকে তীক্ষ্ণ করতে সহায়তা করে। তবে সাবধানতার সাথে করা উচিত কারণ আমরা কেবল পিক্সেল মান বাড়িয়ে চলেছি। গ্রেস্কেল পিক্সেল মান ১৯০ এর কল্পনা করুন, এটি যদি ২ ওজনের সাথে গুণিত হয় তবে 380 হয় তবে সর্বোচ্চ অনুমোদিত পিক্সেলের ব্যাপ্তির কারণে 255 এ ছাঁটা হয়। এটি তথ্য হ্রাস এবং ধুয়ে যাওয়া চিত্রকে বাড়ে।
addWeighted(frame, 1.5, image, -0.5, 0, image);
এই বিষয়ে স্পষ্টতার জন্য, কয়েকটি বিষয় সত্যই করা উচিত:
চিত্রগুলি তীক্ষ্ণ করা একটি অসুস্থ-পোজ সমস্যা। অন্য কথায়, অস্পষ্টতা একটি ক্ষয়ক্ষতিপূর্ণ অপারেশন, এবং এ থেকে ফিরে যাওয়া সাধারণভাবে সম্ভব নয়।
একক চিত্রকে তীক্ষ্ণ করতে, আপনি কোন ধরণের চিত্রটি চান তা এবং এটি কীভাবে ঝাপসা হয়ে গেছে তাতে কোনওভাবে সীমাবদ্ধতা (অনুমান) যুক্ত করা দরকার। এটি প্রাকৃতিক চিত্রের পরিসংখ্যানের ক্ষেত্র। এই পরিসংখ্যানগুলি স্পষ্টভাবে বা স্পষ্টতই তাদের অ্যালগোরিদমে ধরে রাখার জন্য পদ্ধতিগুলি (গভীর শিক্ষার সর্বাধিক স্পষ্টতই কোডিংযুক্ত) learning কোনও ডিওজি বা ল্যাপলাসিয়ান পিরামিড পঁচনের স্তরের কিছু অংশকে ওজনযুক্ত করার সাধারণ পদ্ধতি , যা ব্রায়ান বার্নস উত্তরটির সাধারণীকরণ, ধরে নেওয়া হয় যে কোনও গাউসিয়ান অস্পষ্ট চিত্রটি দূষিত করেছে, এবং কীভাবে ওজন কীভাবে করা হয়েছে তা অনুমানের সাথে সংযুক্ত রয়েছে ইমেজ শুরু সঙ্গে।
তথ্যের অন্যান্য উত্সগুলি সমস্যাটি সু-পোজযুক্ত তত্পর করে তুলতে পারে। এ জাতীয় তথ্যের সাধারণ উত্স হ'ল চলন্ত বস্তুর ভিডিও বা বহু-দর্শন সেটিং। সেই সেটিংটিতে ধারালোকে সাধারণত সুপার-রেজোলিউশন বলা হয় (এটির জন্য এটি খুব খারাপ নাম তবে এটি একাডেমিক চেনাশোনাগুলিতে আটকে গেছে)। হয়েছে OpenCV সুপার রিসোলিউশনের পদ্ধতি একটি দীর্ঘ সময় থেকে .... যদিও তারা সাধারণত Dont কাজ যে ভাল জন্য বাস্তব সমস্যার স্থায়ী আমি তাদের চেক আউট। আমি আশা করি গভীর শিক্ষাগুলি এখানেও কিছু দুর্দান্ত ফলাফল তৈরি করেছে। হয়তো কেউ সেখানে সার্থক মন্তব্য উপর পোস্ট করবে।
কোনও চিত্রকে তীক্ষ্ণ করতে আমরা ফিল্টারটি ব্যবহার করতে পারি (পূর্বের অনেক উত্তরের মতো)
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32)
kernel /= denominator * kernel
ডিনোমিনেটর 1 হলে এটি সবচেয়ে বেশি হবে এবং বৃদ্ধি হিসাবে এটি হ্রাস পাবে (2.3 ..)
ডিনোমিনেটর 3 হলে সবচেয়ে বেশি ব্যবহৃত হয়।
নীচে বাস্তবায়ন হয়।
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32)
kernel = 1/3 * kernel
dst = cv2.filter2D(image, -1, kernel)