এখানে একটি ধারণা। আমরা এই সমস্যাটিকে বিভিন্ন পদক্ষেপে বিভক্ত করি:
গড় আয়তক্ষেত্রাকার কনট্যুর অঞ্চল নির্ধারণ করুন। এর পরে আমরা কনস্যুরের সীমানা আয়তক্ষেত্র অঞ্চল ব্যবহার করে সূচনা এবং ফিল্টার খুঁজে পাই । আমরা এটি করার কারণটি পর্যবেক্ষণের কারণ হ'ল যে কোনও সাধারণ চরিত্র কেবলমাত্র এত বড় হবে তবে বৃহত আওয়াজ বৃহত্তর আয়তক্ষেত্রাকার অঞ্চলকে ছড়িয়ে দেবে। তারপরে আমরা গড় ক্ষেত্রফল নির্ধারণ করি।
বড় বড় আউটোরের সরু সরান। আমরা আবার কনট্যুরগুলির মাধ্যমে পুনরাবৃত্তি করি এবং বড় কনট্যুরগুলি 5x
পূরণ করে তারা যদি গড় কনট্যুর ক্ষেত্রের গড়ের চেয়ে বড় হয় তবে তাদের সরিয়ে ফেলি। একটি নির্দিষ্ট প্রান্তিক অঞ্চলটি ব্যবহার না করে আমরা আরও দৃust়তার জন্য এই গতিশীল প্রান্তিকতাটি ব্যবহার করি।
অক্ষর সংযোগ করতে একটি উল্লম্ব কার্নেল দিয়ে ডায়াল্ট । ধারণাগুলি পর্যবেক্ষণের সদ্ব্যবহার করে যে অক্ষরগুলি কলামগুলিতে সাজানো আছে। একটি উল্লম্ব কার্নেলটি বিচ্ছিন্ন করে আমরা পাঠ্যকে একসাথে সংযুক্ত করি যাতে শব্দটি এই সম্মিলিত কনট্যুরের অন্তর্ভুক্ত হবে না।
ছোট আওয়াজ সরান । এখন রাখার পাঠ্যটি সংযুক্ত হয়ে গেছে, আমরা 4x
গড় রূপরেখা ক্ষেত্রের চেয়ে ছোট ছোট কোনও রূপক খুঁজে পাই এবং সরিয়ে ফেলি ।
বিটওয়াইস-এবং চিত্র পুনর্গঠন করতে । যেহেতু আমরা কেবল আমাদের মুখোশটি চালিয়ে যাওয়ার জন্য আকাঙ্ক্ষিত সংক্ষিপ্তসার রেখেছি, তাই আমরা বিটওয়াই-এবং পাঠ্যটি সংরক্ষণ এবং আমাদের ফলাফল পেতে।
প্রক্রিয়াটির একটি দৃশ্যায়ন এখানে:
বাইনারি ইমেজ পাওয়ার জন্য আমরা ওৎসুর প্রান্তিকের পরে গড় আয়তক্ষেত্রাকার কনট্যুর অঞ্চল নির্ধারণের জন্য সূচি খুঁজে পাই । এখান থেকে আমরা আউটপুট পূরণ করে সবুজ রঙে হাইলাইট করা বড় আউটলেট কনসার্সগুলি সরিয়ে ফেলি
আমরা একটি গঠন করা পরবর্তী উল্লম্ব কার্নেল এবং উম্মুক্ত করে দেইনি অক্ষর সংযুক্ত হওয়ার জন্য। এই পদক্ষেপটি সমস্ত আকাঙ্ক্ষিত পাঠ্যকে সংযুক্ত করে এবং শব্দের পৃথক ব্লবগুলিতে পৃথক করে।
এখন আমরা ছোট আওয়াজ সরাতে কনট্যুর অঞ্চল ব্যবহার করে রূপক এবং ফিল্টার পাই
এখানে সরানো সমস্ত শব্দ কণা সবুজতে হাইলাইট করা আছে
ফলাফল
কোড
import cv2
# Load image, grayscale, and Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Determine average contour area
average_area = []
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
area = w * h
average_area.append(area)
average = sum(average_area) / len(average_area)
# Remove large lines if contour area is 5x bigger then average contour area
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
area = w * h
if area > average * 5:
cv2.drawContours(thresh, [c], -1, (0,0,0), -1)
# Dilate with vertical kernel to connect characters
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,5))
dilate = cv2.dilate(thresh, kernel, iterations=3)
# Remove small noise if contour area is smaller than 4x average
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < average * 4:
cv2.drawContours(dilate, [c], -1, (0,0,0), -1)
# Bitwise mask with input image
result = cv2.bitwise_and(image, image, mask=dilate)
result[dilate==0] = (255,255,255)
cv2.imshow('result', result)
cv2.imshow('dilate', dilate)
cv2.imshow('thresh', thresh)
cv2.waitKey()
দ্রষ্টব্য: ditionতিহ্যবাহী চিত্র প্রক্রিয়াকরণ থ্রেশহোল্ডিং, মোর্ফোলজিকাল ক্রিয়াকলাপ এবং কনট্যুর ফিল্টারিং (কনট্যুর সান্নিধ্য, ক্ষেত্র, দিক অনুপাত বা ব্লব সনাক্তকরণ) এর মধ্যে সীমাবদ্ধ। যেহেতু ইনপুট চিত্রগুলি অক্ষর পাঠ্যের আকারের ভিত্তিতে পরিবর্তিত হতে পারে, তাই একক সমাধান খুঁজে পাওয়া বেশ কঠিন। গতিশীল সমাধানের জন্য আপনি নিজের শ্রেণিবদ্ধকে মেশিন / গভীর শিক্ষার সাথে প্রশিক্ষণ দিতে চাইতে পারেন।