ওসিআরের জন্য চিত্র পরিষ্কার করা হচ্ছে


9

আমি ওসিআরের জন্য চিত্রগুলি সাফ করার চেষ্টা করছি: (লাইনগুলি)

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

ছবিটির মাঝে মাঝে আরও প্রক্রিয়া করার জন্য আমাকে এই লাইনগুলি সরিয়ে ফেলতে হবে এবং আমি বেশ কাছাকাছি আসছি তবে প্রান্তের পাঠ্যটি থেকে অনেক বেশি সময় কেটে যায়:

    copy = img.copy()
    blur = cv2.GaussianBlur(copy, (9,9), 0)
    thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
    dilate = cv2.dilate(thresh, kernel, iterations=2)

    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 > 300:
            x,y,w,h = cv2.boundingRect(c)
            cv2.rectangle(copy, (x, y), (x + w, y + h), (36,255,12), 3)

সম্পাদনা করুন: ফন্টের পরিবর্তনের ক্ষেত্রে ধ্রুবক সংখ্যা ব্যবহার করা কার্যকর হবে না Edit এটি করার কোনও সাধারণ উপায় আছে?


2
এগুলির কয়েকটি লাইন বা সেগুলির টুকরোগুলির বৈধ পাঠ্যগুলির মতো একই বৈশিষ্ট্য রয়েছে এবং বৈধ পাঠ্য নষ্ট না করে এগুলি থেকে মুক্তি পাওয়া কঠিন হবে be যদি এটি প্রযোজ্য হয় তবে আপনি এই বিষয়গুলিতে ফোকাস করতে পারেন যে তারা অক্ষরের চেয়ে দীর্ঘ এবং কিছুটা বিচ্ছিন্ন। সুতরাং একটি প্রথম পদক্ষেপ অক্ষরের আকার এবং ঘনিষ্ঠতা অনুমান করা যেতে পারে।
ইয়ভেস দাউস্ট

@ ইয়ভসডউস্ট কীভাবে চরিত্রগুলির ঘনিষ্ঠতা খুঁজে পেতে পারেন? (যেহেতু আকারে
নিখুঁতভাবে

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

একে অপরের কাছাকাছি একাধিক ছোট লাইন ক্ষেত্রে তাদের নিকটতম প্রতিবেশী অন্য ছোট লাইন হবে না? অন্যান্য সমস্ত ব্লকের গড় দূরত্ব গণনা করা খুব ব্যয়বহুল হবে?
K41F4r

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

উত্তর:


14

এখানে একটি ধারণা। আমরা এই সমস্যাটিকে বিভিন্ন পদক্ষেপে বিভক্ত করি:

  1. গড় আয়তক্ষেত্রাকার কনট্যুর অঞ্চল নির্ধারণ করুন। এর পরে আমরা কনস্যুরের সীমানা আয়তক্ষেত্র অঞ্চল ব্যবহার করে সূচনা এবং ফিল্টার খুঁজে পাই । আমরা এটি করার কারণটি পর্যবেক্ষণের কারণ হ'ল যে কোনও সাধারণ চরিত্র কেবলমাত্র এত বড় হবে তবে বৃহত আওয়াজ বৃহত্তর আয়তক্ষেত্রাকার অঞ্চলকে ছড়িয়ে দেবে। তারপরে আমরা গড় ক্ষেত্রফল নির্ধারণ করি।

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

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

  4. ছোট আওয়াজ সরান । এখন রাখার পাঠ্যটি সংযুক্ত হয়ে গেছে, আমরা 4xগড় রূপরেখা ক্ষেত্রের চেয়ে ছোট ছোট কোনও রূপক খুঁজে পাই এবং সরিয়ে ফেলি ।

  5. বিটওয়াইস-এবং চিত্র পুনর্গঠন করতে । যেহেতু আমরা কেবল আমাদের মুখোশটি চালিয়ে যাওয়ার জন্য আকাঙ্ক্ষিত সংক্ষিপ্তসার রেখেছি, তাই আমরা বিটওয়াই-এবং পাঠ্যটি সংরক্ষণ এবং আমাদের ফলাফল পেতে।


প্রক্রিয়াটির একটি দৃশ্যায়ন এখানে:

বাইনারি ইমেজ পাওয়ার জন্য আমরা ওৎসুর প্রান্তিকের পরে গড় আয়তক্ষেত্রাকার কনট্যুর অঞ্চল নির্ধারণের জন্য সূচি খুঁজে পাই । এখান থেকে আমরা আউটপুট পূরণ করে সবুজ রঙে হাইলাইট করা বড় আউটলেট কনসার্সগুলি সরিয়ে ফেলি

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

আমরা একটি গঠন করা পরবর্তী উল্লম্ব কার্নেল এবং উম্মুক্ত করে দেইনি অক্ষর সংযুক্ত হওয়ার জন্য। এই পদক্ষেপটি সমস্ত আকাঙ্ক্ষিত পাঠ্যকে সংযুক্ত করে এবং শব্দের পৃথক ব্লবগুলিতে পৃথক করে।

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

এখন আমরা ছোট আওয়াজ সরাতে কনট্যুর অঞ্চল ব্যবহার করে রূপক এবং ফিল্টার পাই

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

এখানে সরানো সমস্ত শব্দ কণা সবুজতে হাইলাইট করা আছে

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

ফলাফল

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

কোড

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তিহ্যবাহী চিত্র প্রক্রিয়াকরণ থ্রেশহোল্ডিং, মোর্ফোলজিকাল ক্রিয়াকলাপ এবং কনট্যুর ফিল্টারিং (কনট্যুর সান্নিধ্য, ক্ষেত্র, দিক অনুপাত বা ব্লব সনাক্তকরণ) এর মধ্যে সীমাবদ্ধ। যেহেতু ইনপুট চিত্রগুলি অক্ষর পাঠ্যের আকারের ভিত্তিতে পরিবর্তিত হতে পারে, তাই একক সমাধান খুঁজে পাওয়া বেশ কঠিন। গতিশীল সমাধানের জন্য আপনি নিজের শ্রেণিবদ্ধকে মেশিন / গভীর শিক্ষার সাথে প্রশিক্ষণ দিতে চাইতে পারেন।


1
বড় ফন্টের ক্ষেত্রে এটি কি টেক্সটটি মুছে ফেলবে না?
K41F4r

হ্যাঁ এটি হতে পারে, তাই আপনাকে প্রান্তিক ক্ষেত্রের মানটি সামঞ্জস্য করতে হবে। আরও গতিশীল পদ্ধতির জন্য একটি ধারণাটি গড় চরিত্রের ক্ষেত্রটি নির্ধারণ করে তারপরে প্রান্তিকের হিসাবে এটি ব্যবহার করুন
নাট্যান্সিস

উদাহরণটির সাথে খুব সুনির্দিষ্ট বলে মনে হচ্ছে, গড় অঞ্চল ব্যবহার করে এখনও পাঠ্যকে অনেক সময় মুছে ফেলা হবে যা
ওসিআরের

আপনি পোস্টে যোগ করতে পারে এমন আরও একটি উদাহরণ ইনপুট চিত্র রয়েছে কি?
নাট্যান্সিস

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