ভূমিকা
থ্রেশহোল্ডিং হল একটি সহজ এবং কার্যকরী কৌশল যা একটি ছবিতে মৌলিক বিভাজন সঞ্চালন করতে এবং এটিকে বাইনারি করতে (এটিকে একটি বাইনারি ছবিতে পরিণত করুন) যেখানে পিক্সেল হয় 0
or 1
(অথবা 255
যদি আপনি তাদের প্রতিনিধিত্ব করতে পূর্ণসংখ্যা ব্যবহার করছেন)।
সাধারণত, আপনি একটি চিত্রে সাধারণ পটভূমি-পুরোভাগ বিভাজন সম্পাদন করতে থ্রেশহোল্ডিং ব্যবহার করতে পারেন এবং এটি প্রতিটি পিক্সেলের জন্য একটি সাধারণ কৌশলে বৈকল্পিকগুলিতে ফুটে ওঠে:
if pixel_value > threshold:
pixel_value = MAX
else:
pixel_value = 0
এই অপরিহার্য প্রক্রিয়া হিসাবে পরিচিত হয় বাইনারি থ্রেশহোল্ডিং. এখন - বিভিন্ন উপায়ে আপনি এই সাধারণ ধারণাটি পরিবর্তন করতে পারেন, যার মধ্যে ক্রিয়াকলাপগুলিকে উল্টানো (সুইচ করা) >
a দিয়ে স্বাক্ষর করুন <
চিহ্ন), সেট করা pixel_value
থেকে threshold
একটি সর্বোচ্চ মান/0 এর পরিবর্তে (যাকে ছাঁটাই বলা হয়), রাখা pixel_value
নিজেই যদি এটা উপরে হয় threshold
অথবা যদি এটি নীচে হয় threshold
.
এই সবগুলি সুবিধামত OpenCV-তে প্রয়োগ করা হয়েছে:
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
… যথাক্রমে। এগুলি তুলনামূলকভাবে "নিষ্পাপ" পদ্ধতি যে হেই মোটামুটি সহজ, চিত্রগুলির প্রসঙ্গের জন্য হিসাব করবেন না, কোন আকারগুলি সাধারণ, ইত্যাদি সম্পর্কে জ্ঞান থাকতে হবে৷ এই বৈশিষ্ট্যগুলির জন্য - আমাদের অনেক বেশি গণনাগতভাবে ব্যয়বহুল এবং শক্তিশালী নিয়োগ করতে হবে কৌশল
এখন, এমনকি "নিষ্পাপ" পদ্ধতির সাথেও - কিছু ভাল থ্রেশহোল্ড খোঁজার জন্য হিউরিস্টিকস স্থাপন করা যেতে পারে, এবং এর মধ্যে রয়েছে ওটসু পদ্ধতি এবং ত্রিভুজ পদ্ধতি:
cv2.THRESH_OTSU
cv2.THRESH_TRIANGLE
বিঃদ্রঃ: OpenCV থ্রেশহোল্ডিং একটি প্রাথমিক কৌশল, এবং এটি আলোক পরিবর্তন এবং গ্রেডিয়েন্ট, রঙের ভিন্নতা, ইত্যাদির প্রতি সংবেদনশীল। এটি তুলনামূলকভাবে পরিষ্কার ছবিগুলিতে সবচেয়ে ভাল প্রয়োগ করা হয়, শব্দ কমাতে ঝাপসা করার পরে, আপনি যে বস্তুগুলিকে ভাগ করতে চান তাতে রঙের বৈচিত্র্য ছাড়াই।
একটি একক থ্রেশহোল্ড মান সহ মৌলিক থ্রেশহোল্ডিংয়ের কিছু সমস্যাগুলি কাটিয়ে উঠার আরেকটি উপায় হল ব্যবহার করা অভিযোজিত থ্রেশহোল্ডিং যা বিশ্বব্যাপী না করে একটি চিত্রের প্রতিটি ছোট অঞ্চলে একটি থ্রেশহোল্ড মান প্রয়োগ করে৷
OpenCV সহ সহজ থ্রেশহোল্ডিং
OpenCV এর Python API-এ থ্রেশহোল্ডিং এর মাধ্যমে করা হয় cv2.threshold()
পদ্ধতি - যা একটি চিত্র গ্রহণ করে (NumPy অ্যারে, পূর্ণসংখ্যার সাথে উপস্থাপিত), থ্রেশহোল্ড, সর্বোচ্চ মান এবং থ্রেশহোল্ডিং পদ্ধতি (কীভাবে threshold
এবং maximum_value
ব্যবহৃত):
img = cv2.imread('objects.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blurred = cv2.GaussianBlur(img, (7, 7), 0)
ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)
রিটার্ন কোডটি শুধুমাত্র প্রয়োগ করা থ্রেশহোল্ড:
print(f"Threshold: {ret}")
এখানে, যেহেতু থ্রেশহোল্ড 220
এবং আমরা ব্যবহার করেছি THRESH_BINARY
পদ্ধতি - উপরে প্রতিটি পিক্সেল মান 220
পর্যন্ত বৃদ্ধি করা হবে 255
, যখন প্রতিটি পিক্সেল মান নীচে 220
পর্যন্ত নামিয়ে আনা হবে 0
, একটি কালো এবং সাদা ইমেজ তৈরি করা, একটি "মাস্ক" সহ, অগ্রভাগের বস্তুগুলিকে আচ্ছাদন করে৷
কেন 220? ছবিটি দেখতে কেমন তা জানার ফলে আপনি কোন থ্রেশহোল্ডটি বেছে নিতে পারেন সে সম্পর্কে কিছু আনুমানিক অনুমান করতে পারবেন৷ অনুশীলনে, আপনি খুব কমই একটি ম্যানুয়াল থ্রেশহোল্ড সেট করতে চাইবেন এবং আমরা এক মুহূর্তের মধ্যে স্বয়ংক্রিয় থ্রেশহোল্ড নির্বাচন কভার করব।
এর ফলাফল চক্রান্ত করা যাক! ওপেনসিভি উইন্ডোগুলি কিছুটা চটকদার হতে পারে, তাই আমরা ম্যাটপ্লটলিব ব্যবহার করে আসল চিত্র, অস্পষ্ট চিত্র এবং ফলাফলগুলি প্লট করব:
fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)
থ্রেশহোল্ডিং পদ্ধতি
আগে উল্লিখিত হিসাবে, বিভিন্ন উপায়ে আপনি একটি ফাংশনে থ্রেশহোল্ড এবং সর্বোচ্চ মান ব্যবহার করতে পারেন। আমরা প্রাথমিকভাবে বাইনারি থ্রেশহোল্ডটি দেখেছি। আসুন পদ্ধতিগুলির একটি তালিকা তৈরি করি, এবং ফলাফলগুলি প্লট করে সেগুলি একের পর এক প্রয়োগ করি:
methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']
def thresh(img_path, method, index):
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
blurred = cv2.GaussianBlur(img, (7, 7), 0)
ret, img_masked = cv2.threshold(blurred, 220, 255, method)
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
fig.suptitle(names[index], fontsize=18)
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)
plt.tight_layout()
for index, method in enumerate(methods):
thresh('coins.jpeg', method, index)
THRESH_BINARY
এবং THRESH_BINARY_INV
একে অপরের বিপরীত, এবং এর মধ্যে একটি চিত্র বাইনারি করে 0
এবং 255
, তাদের যথাক্রমে ব্যাকগ্রাউন্ড এবং ফোরগ্রাউন্ডে বরাদ্দ করা, এবং তদ্বিপরীত।
THRESH_TRUNC
মধ্যে ইমেজ binarizes threshold
এবং 255
.
THRESH_TOZERO
এবং THRESH_TOZERO_INV
মধ্যে binarize 0
এবং বর্তমান পিক্সেল মান (src(x, y)
) চলুন ফলাফলের চিত্রগুলি একবার দেখে নেওয়া যাক:
সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!
এই পদ্ধতিগুলি যথেষ্ট স্বজ্ঞাত - কিন্তু, কিভাবে আমরা একটি ভাল থ্রেশহোল্ড মান স্বয়ংক্রিয় করতে পারি, এবং একটি "ভাল প্রান্তিক" মান এমনকি মানে কি? এখনও পর্যন্ত বেশিরভাগ ফলাফলে অ-আদর্শ মুখোশ ছিল, সেগুলিতে চিহ্ন এবং দাগ রয়েছে। মুদ্রার প্রতিফলিত পৃষ্ঠের পার্থক্যের কারণে এটি ঘটে - শিলাগুলি কীভাবে আলোকে প্রতিফলিত করে তার পার্থক্যের কারণে এগুলি সমানভাবে রঙিন হয় না।
আমরা, একটি মাত্রায়, একটি ভাল গ্লোবাল থ্রেশহোল্ড খুঁজে বের করে এর সাথে লড়াই করতে পারি।
OpenCV সহ স্বয়ংক্রিয়/অপ্টিমাইজড থ্রেশহোল্ডিং
ওপেনসিভি দুটি কার্যকর গ্লোবাল থ্রেশহোল্ড অনুসন্ধান পদ্ধতি ব্যবহার করে - ওটসুর পদ্ধতি এবং ত্রিভুজ পদ্ধতি।
Otsu এর পদ্ধতি অনুমান করে যে এটি কাজ করছে দ্বি-মোডাল ছবি দ্বি-মোডাল চিত্রগুলি এমন চিত্র যার রঙের হিস্টোগ্রামে কেবল দুটি শিখর রয়েছে (অর্থাৎ কেবল দুটি স্বতন্ত্র পিক্সেল মান রয়েছে)। বিবেচনা করে যে শিখরগুলি প্রতিটি একটি শ্রেণীর অন্তর্গত যেমন একটি "পটভূমি" এবং "পুরোভূমি" - আদর্শ প্রান্তিকটি তাদের মাঝখানে রয়েছে।
চিত্র ক্রেডিট: https://scipy-lectures.org/
আপনি গাউসিয়ান ব্লার দিয়ে কিছু ছবিকে আরও দ্বি-মোডাল করতে পারেন, কিন্তু সবগুলো নয়।
একটি বিকল্প, প্রায়শই ভাল পারফরম্যান্সকারী অ্যালগরিদম হল ত্রিভুজ অ্যালগরিদম, যা ধূসর-স্তরের হিস্টোগ্রামের সর্বাধিক এবং সর্বনিম্ন মধ্যে দূরত্ব গণনা করে এবং একটি রেখা আঁকে। যে বিন্দুতে সেই লাইনটি হিস্টোগ্রামের বাকি অংশ থেকে সর্বাধিক দূরে সেটিকে ট্রেশহোল্ড হিসাবে বেছে নেওয়া হয়েছে:
এই দুটিই একটি ধূসর আকারের চিত্র ধরে নেয়, তাই আমাদের ইনপুট চিত্রটিকে ধূসরে রূপান্তর করতে হবে cv2.cvtColor()
:
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)
masked = cv2.bitwise_and(img, img, mask=mask1)
আসুন উভয় পদ্ধতির মাধ্যমে চিত্রটি চালাই এবং ফলাফলগুলি কল্পনা করি:
methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']
def thresh(img_path, method, index):
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
ret, img_masked = cv2.threshold(blurred, 0, 255, method)
print(f"Threshold: {ret}")
fig, ax = plt.subplots(1, 3, figsize=(12, 5))
fig.suptitle(names[index], fontsize=18)
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))
for index, method in enumerate(methods):
thresh('coins.jpeg', method, index)
এখানে, ত্রিভুজ পদ্ধতিটি ওটসুর পদ্ধতিকে ছাড়িয়ে গেছে, কারণ চিত্রটি দ্বি-মোডাল নয়:
import numpy as np
img = cv2.imread('coins.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)
যাইহোক, এটা স্পষ্ট যে কিভাবে ত্রিভুজ পদ্ধতিটি ইমেজের সাথে কাজ করতে এবং আরও সন্তোষজনক ফলাফল তৈরি করতে সক্ষম হয়েছিল।
OpenCV থ্রেশহোল্ডিংয়ের সীমাবদ্ধতা
OpenCV এর সাথে থ্রেশহোল্ডিং সহজ, সহজ এবং দক্ষ। তবুও, এটা মোটামুটি সীমিত. যত তাড়াতাড়ি আপনি রঙিন উপাদান, নন-ইউনিফর্ম ব্যাকগ্রাউন্ড এবং পরিবর্তনশীল আলোর অবস্থার সাথে পরিচয় করিয়ে দেন - একটি ধারণা হিসাবে গ্লোবাল থ্রেশহোল্ডিং খুব কঠোর হয়ে যায়।
চিত্রগুলি সাধারণত একটি একক থ্রেশহোল্ডের জন্য যথেষ্ট জটিল হয় এবং এটি আংশিকভাবে সমাধান করা যেতে পারে অভিযোজিত থ্রেশহোল্ডিং, যেখানে একটি একক গ্লোবাল একের পরিবর্তে অনেকগুলি স্থানীয় থ্রেশহোল্ড প্রয়োগ করা হয়৷ সীমিত হলেও, অভিযোজিত থ্রেশহোল্ডিং গ্লোবাল থ্রেশহোল্ডিংয়ের চেয়ে অনেক বেশি নমনীয়।
উপসংহার
সাম্প্রতিক বছরগুলিতে, বাইনারি সেগমেন্টেশন (যেমন আমরা এখানে করেছি) এবং মাল্টি-লেবেল সেগমেন্টেশন (যেখানে আপনার ইচ্ছামত সংখ্যক ক্লাস এনকোড করা থাকতে পারে) সফলভাবে গভীর শিক্ষার নেটওয়ার্কগুলির সাথে মডেল করা হয়েছে, যা অনেক বেশি শক্তিশালী এবং নমনীয়। উপরন্তু, তারা যে ছবিগুলিকে সেগমেন্ট করছে তাতে তারা বিশ্বব্যাপী এবং স্থানীয় প্রসঙ্গ এনকোড করতে পারে। নেতিবাচক দিক হল - তাদের প্রশিক্ষণের জন্য আপনার ডেটার পাশাপাশি সময় এবং দক্ষতার প্রয়োজন।
অন-দ্য-ফ্লাই, সহজ থ্রেশহোল্ডিংয়ের জন্য, আপনি OpenCV ব্যবহার করতে পারেন। সঠিক, উৎপাদন-স্তরের বিভাজনের জন্য, আপনি নিউরাল নেটওয়ার্ক ব্যবহার করতে চাইবেন।
আরও এগিয়ে যাওয়া - কম্পিউটার ভিশনের জন্য ব্যবহারিক গভীর শিক্ষা
আপনার অনুসন্ধিৎসু প্রকৃতি আপনাকে আরও যেতে চায়? আমরা আমাদের চেক আউট সুপারিশ পথ: "পাইথনের সাথে কম্পিউটার ভিশনের জন্য ব্যবহারিক গভীর শিক্ষা".
আরেকটি কম্পিউটার ভিশন কোর্স?
আমরা MNIST সংখ্যা বা MNIST ফ্যাশনের শ্রেণিবিন্যাস করব না। তারা অনেক আগে থেকেই তাদের দায়িত্ব পালন করেছে। উন্নত ব্ল্যাক-বক্স আর্কিটেকচারগুলিকে পারফরম্যান্সের ভার বহন করতে দেওয়ার আগে অনেকগুলি শেখার সংস্থান মৌলিক ডেটাসেট এবং মৌলিক আর্কিটেকচারের উপর ফোকাস করছে।
আমরা ফোকাস করতে চাই demystification, বাস্তবতা, বোধশক্তি, স্বজ্ঞা এবং বাস্তব প্রকল্প. শিখতে চাই কিভাবে আপনি একটি পার্থক্য করতে পারেন? স্তন ক্যান্সারের জন্য আমাদের মস্তিষ্ক যেভাবে ছবিগুলিকে প্রক্রিয়াকরণ করে, তার থেকে শুরু করে স্তন ক্যান্সারের জন্য একটি গবেষণা-গ্রেড ডিপ লার্নিং ক্লাসিফায়ার লেখা পর্যন্ত আমরা আপনাকে "হ্যালুসিনেট" করার নেটওয়ার্কগুলিতে নিয়ে যাব, আপনাকে ব্যবহারিক কাজের মাধ্যমে নীতি ও তত্ত্ব শেখাবো, আপনাকে সজ্জিত করব কম্পিউটারের দৃষ্টিভঙ্গি সমাধানের জন্য গভীর শিক্ষা প্রয়োগে বিশেষজ্ঞ হওয়ার উপায় এবং সরঞ্জাম।
ভিতরে কি?
- দৃষ্টির প্রথম নীতি এবং কীভাবে কম্পিউটারকে "দেখতে" শেখানো যায়
- কম্পিউটার ভিশনের বিভিন্ন কাজ এবং অ্যাপ্লিকেশন
- ট্রেডের টুল যা আপনার কাজকে সহজ করে তুলবে
- কম্পিউটার ভিশনের জন্য ডেটাসেট খোঁজা, তৈরি এবং ব্যবহার করা
- কনভোল্যুশনাল নিউরাল নেটওয়ার্কের তত্ত্ব এবং প্রয়োগ
- ডেটাসেটে ডোমেন শিফট, সহ-ঘটনা এবং অন্যান্য পক্ষপাতগুলি পরিচালনা করা
- আপনার সুবিধার জন্য শেখার স্থানান্তর এবং অন্যদের প্রশিক্ষণের সময় এবং গণনামূলক সংস্থানগুলি ব্যবহার করুন
- একটি অত্যাধুনিক স্তন ক্যান্সারের শ্রেণীবিভাগ তৈরি এবং প্রশিক্ষণ
- কীভাবে মূলধারার ধারণাগুলিতে সংশয়বাদের একটি স্বাস্থ্যকর ডোজ প্রয়োগ করা যায় এবং ব্যাপকভাবে গৃহীত কৌশলগুলির প্রভাব বোঝা যায়
- T-SNE এবং PCA ব্যবহার করে একটি ConvNet-এর "ধারণা স্থান" ভিজ্যুয়ালাইজ করা
- কোম্পানিগুলি কীভাবে ভাল ফলাফল অর্জন করতে কম্পিউটার দৃষ্টি কৌশল ব্যবহার করে তার কেস স্টাডি
- সঠিক মডেল মূল্যায়ন, সুপ্ত স্থান ভিজ্যুয়ালাইজেশন এবং মডেলের মনোযোগ সনাক্তকরণ
- ডোমেন গবেষণা সম্পাদন করা, আপনার নিজস্ব ডেটাসেট প্রক্রিয়াকরণ এবং মডেল পরীক্ষা স্থাপন করা
- অত্যাধুনিক স্থাপত্য, ধারণাগুলির অগ্রগতি, কী সেগুলিকে অনন্য করে তোলে এবং কীভাবে সেগুলি বাস্তবায়ন করা যায়
- KerasCV – একটি আধুনিক পাইপলাইন এবং মডেল তৈরি করার জন্য একটি WIP লাইব্রেরি
- কিভাবে পার্স এবং পেপার পড়ুন এবং সেগুলি নিজেই প্রয়োগ করুন
- আপনার আবেদনের উপর নির্ভর করে মডেল নির্বাচন করুন
- এন্ড-টু-এন্ড মেশিন লার্নিং পাইপলাইন তৈরি করা
- দ্রুত আর-সিএনএন, রেটিনানেট, এসএসডি এবং ইওলোর সাহায্যে অবজেক্ট সনাক্তকরণের উপর ল্যান্ডস্কেপ এবং অন্তর্দৃষ্টি
- উদাহরণ এবং শব্দার্থিক বিভাজন
- YOLOv5 এর সাথে রিয়েল-টাইম অবজেক্ট রিকগনিশন
- YOLOv5 অবজেক্ট ডিটেক্টর প্রশিক্ষণ
- KerasNLP ব্যবহার করে ট্রান্সফরমারের সাথে কাজ করা (শিল্প-শক্তি WIP লাইব্রেরি)
- চিত্রের ক্যাপশন তৈরি করতে ConvNets-এর সাথে ট্রান্সফরমার একীভূত করা
- ডিপড্রিম
- কম্পিউটার ভিশনের জন্য ডিপ লার্নিং মডেল অপ্টিমাইজেশান