আমি কীভাবে ওপেনসিভিতে একটি চিত্র তীক্ষ্ণ করতে পারি?


122

আমি কীভাবে ওপেনসিভি ব্যবহার করে একটি চিত্র তীক্ষ্ণ করতে পারি ?

ধূমপান করার বা ঝাপসা করার অনেকগুলি উপায় রয়েছে তবে আমি তীক্ষ্ণ হওয়ার মতো দেখতে পাচ্ছিলাম না।

উত্তর:


160

আনসার্প মাস্কিংয়ের বিষয়ে উইকিপিডিয়া নিবন্ধে একটি সাধারণ পদ্ধতি নির্ধারণ করা হয়েছে :

আপনি একটি গাউসিয়ান স্মুথিং ফিল্টার ব্যবহার করেন এবং মূল চিত্র থেকে স্মুটেড সংস্করণটি বিয়োগ করুন (একটি ওজনযুক্ত উপায়ে যাতে একটি ধ্রুবক অঞ্চলের মান স্থির থাকে)।

একটি নিশিত সংস্করণ পেতে frameমধ্যে image: (উভয় cv::Mat)

cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);

আপনার নিজের জন্য সামঞ্জস্য করার জন্য এমন কিছু প্যারামিটার রয়েছে।

ল্যাপ্লেসিয়ার তীক্ষ্ণতা রয়েছে, যখন আপনি গুগল করেন তখন আপনাকে তার উপর কিছু খুঁজে পাওয়া উচিত।


1
ফটোশপের ফলাফল আনশার্প মাস্কের প্রতিলিপি দেওয়ার কোনও উপায় আছে কি?
রায় 11

@ ড্রাজিক আপনি কি জিজ্ঞাসা করছেন কারণ এটি পুনরায় তৈরি করা যায় না? উপরে উইকিপিডিয়া লিঙ্ক দেওয়া হয়েছে। ডিজিটাল_অনশার্প_মাস্কিং নির্দিষ্ট হতে হবে
তিলপ্রিমের

@ টিলাপ্রিমেরা, আমি জিজ্ঞাসা করছি কারণ ফটোশপের ইউএসএম "ক্লাসিক" ইউএসএম থেকে আলাদা।
রায়

50

আপনি একটি সাধারণ কার্নেল এবং ফিল্টার 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)

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


14

আপনি প্রায় একটি নমুনা কোড জানতে পারেন ব্যবহার "মুখোশটি" অ্যালগরিদম ইমেজ ধার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);

এটা সুন্দর!
রোজভেল্ট

12

আপনি একটি অসম্পূর্ণ মাস্ক ব্যবহার করে একটি চিত্র তীক্ষ্ণ করতে পারেন । আনসার্প মাস্কিং সম্পর্কে আপনি এখানে আরও তথ্য পেতে পারেন । এবং এখানে ওপেনসিভি ব্যবহার করে একটি পাইথন বাস্তবায়ন রয়েছে:

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)

এটি একটি খুব সহজ সংস্করণ বলে মনে হচ্ছে। আপনি দয়া করে পরামিতিগুলি সম্পর্কে আরও কিছুটা তথ্য যুক্ত করতে পারেন। কার্নেলের আকার এবং সিগমা ওপেনসিভিতে সন্ধান করা যেতে পারে তবে পরিমাণ এবং প্রান্তিকের কী হবে? ধন্যবাদ!
চয়েস

2
@ কোয়েজ amountকেবল তীক্ষ্ণ পরিমাণ। উদাহরণস্বরূপ, amount০.০ এর একটি ডিফল্ট মান ০.০ এর তুলনায় একটি তীক্ষ্ণ চিত্র দেয়। thresholdনিম্ন-বিপরীতে মাস্কের জন্য প্রান্তিকতা। অন্য কথায়, যে পিক্সেলগুলির জন্য ইনপুট এবং অস্পষ্ট চিত্রগুলির মধ্যে পার্থক্য thresholdঅপরিবর্তিত থাকবে।
সুরেশ

10

যে কোনও চিত্র হ'ল বিভিন্ন ফ্রিকোয়েন্সি সংকেতের সংগ্রহ। উচ্চতর ফ্রিকোয়েন্সিগুলি প্রান্তগুলি নিয়ন্ত্রণ করে এবং নিম্ন ফ্রিকোয়েন্সি চিত্রের সামগ্রীকে নিয়ন্ত্রণ করে। যখন একটি পিক্সেল মান থেকে অন্যান্য পিক্সেল মানের নিকটবর্তী ঘরে 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);

5

এই বিষয়ে স্পষ্টতার জন্য, কয়েকটি বিষয় সত্যই করা উচিত:

  1. চিত্রগুলি তীক্ষ্ণ করা একটি অসুস্থ-পোজ সমস্যা। অন্য কথায়, অস্পষ্টতা একটি ক্ষয়ক্ষতিপূর্ণ অপারেশন, এবং এ থেকে ফিরে যাওয়া সাধারণভাবে সম্ভব নয়।

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

  3. তথ্যের অন্যান্য উত্সগুলি সমস্যাটি সু-পোজযুক্ত তত্পর করে তুলতে পারে। এ জাতীয় তথ্যের সাধারণ উত্স হ'ল চলন্ত বস্তুর ভিডিও বা বহু-দর্শন সেটিং। সেই সেটিংটিতে ধারালোকে সাধারণত সুপার-রেজোলিউশন বলা হয় (এটির জন্য এটি খুব খারাপ নাম তবে এটি একাডেমিক চেনাশোনাগুলিতে আটকে গেছে)। হয়েছে OpenCV সুপার রিসোলিউশনের পদ্ধতি একটি দীর্ঘ সময় থেকে .... যদিও তারা সাধারণত Dont কাজ যে ভাল জন্য বাস্তব সমস্যার স্থায়ী আমি তাদের চেক আউট। আমি আশা করি গভীর শিক্ষাগুলি এখানেও কিছু দুর্দান্ত ফলাফল তৈরি করেছে। হয়তো কেউ সেখানে সার্থক মন্তব্য উপর পোস্ট করবে।


3

কোনও চিত্রকে তীক্ষ্ণ করতে আমরা ফিল্টারটি ব্যবহার করতে পারি (পূর্বের অনেক উত্তরের মতো)

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)

"এটি সবচেয়ে বেশি হবে" এর কাছে কিছু অনুপস্থিত মনে হচ্ছে ।
পিটার মর্টেনসেন

হ্যাঁ পিটার, আপনাকে ধন্যবাদ!
কাউস্তুবদিন 9

-4

এটি দিয়ে চেষ্টা করুন:

cv::bilateralFilter(img, 9, 75, 75);

আপনি এখানে আরও তথ্য পেতে পারেন ।


9
প্রশ্নটি ইমেজ তীক্ষ্ণ করার বিষয়ে, স্মুথিং সংরক্ষণের প্রান্ত নয়।
মাইকেল বার্ডিনভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.