ঠিক আছে, এখানে আরও একটি সম্ভাব্য সমাধান রয়েছে। আমি জানি আপনি পাইথন নিয়ে কাজ করেন - আমি সি ++ নিয়ে কাজ করি। আমি আপনাকে কিছু ধারণা দেব এবং আশা করি, আপনি যদি এটি চান তবে আপনি এই উত্তরটি প্রয়োগ করতে সক্ষম হবেন।
মূল ধারণাটি হ'ল প্রাক-প্রসেসিংটি মোটেও ব্যবহার না করা (কমপক্ষে প্রাথমিক পর্যায়ে নয়) এবং পরিবর্তে প্রতিটি লক্ষ্য অক্ষরে মনোনিবেশ করা, কিছু বৈশিষ্ট্য পাওয়া এবং প্রতিটি বৈশিষ্ট্যগুলি এই বৈশিষ্ট্য অনুসারে ফিল্টার করা।
আমি প্রাক-প্রক্রিয়াজাতকরণটি ব্যবহার না করার চেষ্টা করছি কারণ: 1) ফিল্টার এবং রূপচর্চা স্তরগুলি ব্লবের মানকে হ্রাস করতে পারে এবং 2) আপনার টার্গেট ব্লবগুলি এমন কিছু বৈশিষ্ট্য প্রদর্শন করে যা আমরা ব্যবহার করতে পারি, মূলত: দিক অনুপাত এবং ক্ষেত্র ।
এটি পরীক্ষা করে দেখুন, সংখ্যা এবং বর্ণগুলি সমস্ত বৃহত্তর থেকে লম্বা বলে মনে হচ্ছে ... তদুপরি, এগুলি নির্দিষ্ট ক্ষেত্রের মানের মধ্যে পৃথক হয়ে দেখা দেয়। উদাহরণস্বরূপ, আপনি "খুব প্রশস্ত" বা "খুব বড়" অবজেক্টগুলি বাতিল করতে চান ।
ধারণাটি হ'ল আমি প্রাক-গণনা করা মানগুলির মধ্যে না পড়ে এমন সব ফিল্টার করব। আমি অক্ষরগুলি (সংখ্যা এবং অক্ষর) পরীক্ষা করেছি এবং সর্বনিম্ন, সর্বাধিক ক্ষেত্রের মান এবং একটি ন্যূনতম দিক অনুপাত (এখানে, উচ্চতা এবং প্রস্থের মধ্যে অনুপাত) নিয়ে এসেছি।
আসুন আলগোরিদিম নিয়ে কাজ করি। চিত্রটি পড়ে এবং এটিটিকে আধটি মাত্রায় পুনরায় আকার দিয়ে শুরু করুন। আপনার চিত্রটি বেশ বড়। গ্রেস্কেলতে রূপান্তর করুন এবং otsu এর মাধ্যমে একটি বাইনারি চিত্র পান, এখানে সিউডো কোড রয়েছে:
//Read input:
inputImage = imread( "diagram.png" );
//Resize Image;
resizeScale = 0.5;
inputResized = imresize( inputImage, resizeScale );
//Convert to grayscale;
inputGray = rgb2gray( inputResized );
//Get binary image via otsu:
binaryImage = imbinarize( inputGray, "Otsu" );
কুল। আমরা এই চিত্রটি নিয়ে কাজ করব। আপনার প্রতিটি সাদা ব্লব পরীক্ষা করতে হবে এবং একটি "বৈশিষ্ট্য ফিল্টার" প্রয়োগ করতে হবে । আমি প্রতিটি ব্লবকে লুপ ট্রুপের জন্য পরিসংখ্যানগুলির সাথে সংযুক্ত উপাদানগুলি ব্যবহার করছি এবং এর ক্ষেত্র এবং দিক অনুপাত পেয়েছি , সি ++ এ এটি নিম্নলিখিতভাবে করা হয়েছে:
//Prepare the output matrices:
cv::Mat outputLabels, stats, centroids;
int connectivity = 8;
//Run the binary image through connected components:
int numberofComponents = cv::connectedComponentsWithStats( binaryImage, outputLabels, stats, centroids, connectivity );
//Prepare a vector of colors – color the filtered blobs in black
std::vector<cv::Vec3b> colors(numberofComponents+1);
colors[0] = cv::Vec3b( 0, 0, 0 ); // Element 0 is the background, which remains black.
//loop through the detected blobs:
for( int i = 1; i <= numberofComponents; i++ ) {
//get area:
auto blobArea = stats.at<int>(i, cv::CC_STAT_AREA);
//get height, width and compute aspect ratio:
auto blobWidth = stats.at<int>(i, cv::CC_STAT_WIDTH);
auto blobHeight = stats.at<int>(i, cv::CC_STAT_HEIGHT);
float blobAspectRatio = (float)blobHeight/(float)blobWidth;
//Filter your blobs…
};
এখন, আমরা বৈশিষ্ট্য ফিল্টার প্রয়োগ করব। এটি প্রাক-গণনাযুক্ত প্রান্তিকের সাথে কেবল একটি তুলনা। আমি নিম্নলিখিত মানগুলি ব্যবহার করেছি:
Minimum Area: 40 Maximum Area:400
MinimumAspectRatio: 1
আপনার for
লুপের অভ্যন্তরে , বর্তমান অঙ্কুরের বৈশিষ্ট্যগুলি এই মানগুলির সাথে তুলনা করুন। যদি পরীক্ষাগুলি ইতিবাচক হয় তবে আপনি ব্লব কালোটি "আঁকুন"। for
লুপের ভিতরে অবিরত :
//Filter your blobs…
//Test the current properties against the thresholds:
bool areaTest = (blobArea > maxArea)||(blobArea < minArea);
bool aspectRatioTest = !(blobAspectRatio > minAspectRatio); //notice we are looking for TALL elements!
//Paint the blob black:
if( areaTest || aspectRatioTest ){
//filtered blobs are colored in black:
colors[i] = cv::Vec3b( 0, 0, 0 );
}else{
//unfiltered blobs are colored in white:
colors[i] = cv::Vec3b( 255, 255, 255 );
}
লুপের পরে, ফিল্টারকৃত চিত্রটি তৈরি করুন:
cv::Mat filteredMat = cv::Mat::zeros( binaryImage.size(), CV_8UC3 );
for( int y = 0; y < filteredMat.rows; y++ ){
for( int x = 0; x < filteredMat.cols; x++ )
{
int label = outputLabels.at<int>(y, x);
filteredMat.at<cv::Vec3b>(y, x) = colors[label];
}
}
এবং thats প্রায় কাছাকাছি এটি. আপনি যে সমস্ত উপাদান সন্ধান করছেন তার মতো নয় এমন সমস্ত উপাদান আপনি ফিল্টার করেছেন। অ্যালগরিদম চালানো আপনি এই ফলাফলটি পান:
ফলাফলগুলি আরও ভালভাবে কল্পনা করতে আমি অতিরিক্তভাবে ব্লবগুলির বাউন্ডিং বক্সগুলি পেয়েছি:
আপনি যেমন দেখতে পাচ্ছেন কিছু উপাদান মিস-শনাক্ত করা হয়েছে। আপনি যে অক্ষরগুলি সন্ধান করছেন সেগুলি আরও ভাল করে সনাক্ত করতে আপনি "বৈশিষ্ট্য ফিল্টার" পরিমার্জন করতে পারেন। একটি গভীর সমাধান, সামান্য কিছুটা মেশিন লার্নিংয়ের সাথে জড়িত, একটি "আদর্শ বৈশিষ্ট্য ভেক্টর" তৈরি করা, ব্লবগুলি থেকে বৈশিষ্ট্যগুলি নিষ্কাশন করা, এবং উভয় ভেক্টরকে একটি সাদৃশ্য পরিমাপের সাথে তুলনা করার প্রয়োজন। আপনি ফলাফল উন্নত করতে কিছু পোস্ট- প্রসেসিং প্রয়োগ করতে পারেন ...
যাই হউক, মানুষ, আপনার সমস্যাটি তুচ্ছ বা সহজ পরিমাণে স্কেলযোগ্য নয় এবং আমি আপনাকে কেবল ধারণা দিচ্ছি। আশা করি, আপনি নিজের সমাধানটি কার্যকর করতে সক্ষম হবেন।