القراء مثلك يساعدون في دعم MUO. عند إجراء عملية شراء باستخدام الروابط الموجودة على موقعنا ، فقد نربح عمولة تابعة. اقرأ أكثر.

قد ترغب في رقمنة مستند لتوفير مساحة مادية أو إنشاء نسخة احتياطية محفوظة. في كلتا الحالتين ، تعد كتابة برنامج يمكنه تحويل صور ملفاتك الورقية إلى تنسيق قياسي مهمة تتفوق فيها Python.

باستخدام مجموعة من المكتبات المناسبة ، يمكنك إنشاء تطبيق صغير لرقمنة المستندات. سيقوم برنامجك بالتقاط صورة لمستند مادي كمدخل ، وتطبيق العديد من تقنيات معالجة الصور عليه ، وإخراج نسخة ممسوحة ضوئيًا من الإدخال.

تحضير بيئتك

لمتابعة هذه المقالة ، يجب أن تكون على دراية بـ أساسيات لغة بايثون. تحتاج أيضًا إلى فهم كيفية العمل مع مكتبة NumPy Python.

افتح أي Python IDE ، وأنشئ ملفي Python. قم بتسمية main.py واحدة والأخرى transform.py. ثم قم بتشغيل الأمر التالي على الجهاز لتثبيت المكتبات المطلوبة.

نقطة تثبيت OpenCV-Python imutils scikit-image NumPy

ستستخدم OpenCV-Python لأخذ إدخال الصورة وإجراء بعض معالجة الصور. Imutils لتغيير حجم المدخلات والمخرجات من الصور. scikit-image لتطبيق حد على الصورة. سيساعدك NumPy في العمل مع المصفوفات.

instagram viewer

انتظر حتى ينتهي التثبيت وحتى يقوم IDE بتحديث الهياكل العظمية للمشروع. بعد اكتمال تحديث الهياكل ، تكون جاهزًا لبدء الترميز. كود المصدر الكامل متاح في ملف مستودع جيثب.

استيراد المكتبات المثبتة

افتح ملف main.py ، واستورد المكتبات التي قمت بتثبيتها على البيئة. سيمكنك هذا من الاتصال واستخدام وظائفهم عند الضرورة.

يستورد السيرة الذاتية 2
يستورد إيموتيلس
من مرشحات يستورد عتبة_المحلية
من تحول يستورد منظور_التحويل

تجاهل الخطأ الذي تم إلقاؤه في المنظور. سيختفي عند الانتهاء من العمل على ملف transform.py.

أخذ المدخلات وتغيير حجمها

التقط صورة واضحة للمستند الذي تريد مسحه ضوئيًا. تأكد من أن الزوايا الأربع للمستند ومحتوياته مرئية. انسخ الصورة إلى نفس المجلد الذي تخزن فيه ملفات البرنامج.

قم بتمرير مسار صورة الإدخال إلى OpenCV. قم بعمل نسخة من الصورة الأصلية كما ستحتاجها أثناء تحويل المنظور. اقسم ارتفاع الصورة الأصلية على الارتفاع الذي ترغب في تغيير حجمها إليه. هذا سوف يحافظ على نسبة العرض إلى الارتفاع. أخيرًا ، أخرج الصورة التي تم تغيير حجمها.

# اجتياز مسار الصورة
original_img = cv2.imread ("sample.jpg")
نسخ = original_img.copy ()

# الارتفاع الذي تم تغيير حجمه بالمئات
النسبة = original_img.shape [0] / 500.0
img_resize = imutils.resize (original_img ، الارتفاع =500)

# عرض الإخراج
cv2.imshow ("الصورة التي تم تغيير حجمها"، img_resize)

# انتظار أن يضغط المستخدم على أي مفتاح
cv2.waitKey (0)

إخراج الكود أعلاه كما يلي:

لقد قمت الآن بتغيير حجم ارتفاع الصورة الأصلية إلى 500 بكسل.

تحويل الصورة التي تم تغيير حجمها إلى تدرج الرمادي

قم بتحويل صورة RGB التي تم تغيير حجمها إلى تدرج رمادي. تعمل معظم مكتبات معالجة الصور فقط مع الصور ذات التدرج الرمادي حيث يسهل معالجتها.

gray_image = cv2.cvtColor (img_resize، cv2.COLOR_BGR2GRAY)
cv2.imshow ("صورة رمادية"، صورة_رمادية)
cv2.waitKey (0)

لاحظ الفرق بين الصورة الأصلية والصورة الرمادية.

تحولت الطاولة الملونة إلى الأبيض والأسود.

تطبيق كاشف الحواف

قم بتطبيق مرشح Gaussian blur على الصورة الرمادية لإزالة التشويش. ثم اتصل بوظيفة OpenCV canny لاكتشاف الحواف الموجودة في الصورة.

blurred_image = cv2.GaussianBlur (gray_image، (5, 5), 0)
edged_img = cv2.Canny (blurred_image ، 75, 200)
cv2.imshow (حواف الصورة، edged_img)
cv2.waitKey (0)

تظهر الحواف على الإخراج.

الحواف التي ستعمل بها هي حواف المستند.

البحث عن أكبر محيط

كشف الخطوط العريضة الموجودة في الصورة ذات الحواف. قم بفرزهم بترتيب تنازلي مع الاحتفاظ فقط بأكبر خمسة معالم. قم بتقريب أكبر محيط بأربعة جوانب عن طريق التكرار عبر الأكفة المصنفة.

cnts ، _ = cv2.findContours (edged_img، cv2.RETR_LIST، cv2.CHAIN_APPROX_SIMPLE)
cnts = مرتبة (cnts ، مفتاح = cv2.contourArea ، معكوس =حقيقي)[:5]

ل ج في cnts:
peri = cv2.arcLength (c ، حقيقي)
تقريبًا = cv2.approxPolyDP (c ، 0.02 * بيري ، حقيقي)

لو لين (تقريبًا) == 4:
doc = تقريبًا
استراحة

من المحتمل أن يحتوي الكفاف ذو الجوانب الأربعة على المستند.

الدوران حول الزوايا الأربع لمحيط المستند

ضع دائرة حول زوايا محيط المستند المكتشف. سيساعدك هذا في تحديد ما إذا كان برنامجك قادرًا على اكتشاف المستند في الصورة.

ع = []

ل د في doc:
tuple_point = tuple (d [0])
cv2.circle (img_resize ، tuple_point ، 3, (0, 0, 255), 4)
p.append (tuple_point)

cv2.imshow ("نقاط الزاوية المحاطة بدائرة"، img_resize)
cv2.waitKey (0)

أداة دائرية على صورة RGB التي تم تغيير حجمها.

بعد اكتشاف المستند ، تحتاج الآن إلى استخراج المستند من الصورة.

استخدام منظور الالتفاف للحصول على الصورة المرغوبة

منظور الالتفاف هو تقنية رؤية الكمبيوتر لتحويل صورة لتصحيح التشوهات. إنه يحول الصورة إلى مستوى مختلف مما يسمح لك بمشاهدة الصورة من زاوية مختلفة.

warped_image = format_transform (نسخ ، doc.reshape (4, 2) * نسبة)
warped_image = cv2.cvtColor (warped_image، cv2.COLOR_BGR2GRAY)
cv2.imshow ("صورة مشوهة"، imutils.resize (warped_image ، الارتفاع =650))
cv2.waitKey (0)

للحصول على صورة مشوهة ، تحتاج إلى إنشاء وحدة بسيطة من شأنها أن تؤدي إلى تحول المنظور.

وحدة التحول

سترتب الوحدة النمطية نقاط زوايا المستند. سيؤدي أيضًا إلى تحويل صورة المستند إلى مستوى مختلف وتغيير زاوية الكاميرا إلى لقطة علوية.

افتح ملف transform.py الذي أنشأته مسبقًا. استيراد مكتبات OpenCV و NumPy.

يستورد حبيبي مثل np
يستورد السيرة الذاتية 2

ستحتوي هذه الوحدة على وظيفتين. قم بإنشاء وظيفة تقوم بترتيب إحداثيات نقاط ركن المستند. سيكون الإحداثي الأول هو تنسيق الزاوية اليسرى العليا ، والثاني سيكون تنسيق الزاوية اليمنى العليا ، سيكون الثالث من الركن الأيمن السفلي ، والإحداثي الرابع سيكون من أسفل اليسار ركن.

deforder_points(نقاط):
# تهيئة قائمة الإحداثيات المطلوب ترتيبها
مستقيم = np.zeros ((4, 2) ، نوع dtype = "تعويم 32")

s = pts.sum (المحور = 1)

# سيكون للنقطة العلوية اليسرى أصغر مجموع
مستقيم [0] = نقاط [np.argmin (s)]

# النقطة السفلية اليمنى ستحصل على أكبر مجموع
مستقيم [2] = نقاط [np.argmax (s)]

حساب الفرق بين النقاط ، و
النقطة العلوية اليمنى سيكون لها أصغر فرق ،
بينما سيكون للأسفل اليسار أكبر فرق
فرق = np.diff (نقاط ، محور = 1)
مستقيم [1] = نقاط [np.argmin (فرق)]
مستقيم [3] = نقاط [np.argmax (فرق)]

# إرجاع الإحداثيات المطلوبة
يعود مستقيم

قم بإنشاء وظيفة ثانية من شأنها حساب إحداثيات الزاوية للصورة الجديدة والحصول على لقطة علوية. ستقوم بعد ذلك بحساب مصفوفة تحويل المنظور وإرجاع الصورة الملتوية.

defمنظور_التحويل(صورة ، نقاط):
# فك الإحداثيات المطلوبة بشكل فردي
Rect = order_points (نقاط)
(tl، tr، br، bl) = rect

احسب عرض الصورة الجديدة ، والتي ستكون
أقصى مسافة بين أسفل اليمين و أسفل اليسار
إحداثيات س أو أعلى اليمين و إحداثيات س أعلى اليسار
widthA = np.sqrt (((br [0] - bl [0]) ** 2) + ((ر [1] - bl [1]) ** 2))
widthB = np.sqrt (((tr [0] - TL [0]) ** 2) + ((tr [1] - TL [1]) ** 2))
maxWidth = max (int (widthA)، int (widthB))

حساب ارتفاع الصورة الجديدة ، والتي ستكون
أقصى مسافة بين أعلى اليسار و إحداثيات ص أسفل اليسار
الارتفاع أ = np.sqrt (((tr [0] - ر [0]) ** 2) + ((tr [1] - ر [1]) ** 2))
heightB = np.sqrt (((tl [0] - bl [0]) ** 2) + ((TL [1] - bl [1]) ** 2))
maxHeight = max (int (heightA) ، int (heightB))

قم ببناء مجموعة نقاط الوجهة للحصول على لقطة علوية
dst = np.array ([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1، اقصى ارتفاع - 1],
[0، اقصى ارتفاع - 1]] ، نوع dtype = "تعويم 32")

# حساب مصفوفة تحويل المنظور
convert_matrix = cv2.getPerspectiveTransform (مستقيم ، dst)

# تطبيق مصفوفة التحويل
مشوه = cv2.warpPerspective (image، transform_matrix، (maxWidth، maxHeight))

# إرجاع الصورة المشوهة
يعود مشوه

لقد قمت الآن بإنشاء وحدة التحويل. سيختفي الآن الخطأ في استيراد المنظور.

لاحظ أن الصورة المعروضة بها لقطة علوية.

تطبيق العتبة التكيفية وحفظ المخرجات الممسوحة ضوئيًا

في ملف main.py ، قم بتطبيق حد غاوسي على الصورة الملتوية. سيعطي هذا الصورة الملتوية مظهرًا ممسوحًا. احفظ إخراج الصورة الممسوحة ضوئيًا في المجلد الذي يحتوي على ملفات البرنامج.

T = threshold_local (warped_image ، 11، الإزاحة =10، الطريقة ="غاوسي")
مشوه = (warped_image> T) .astype ("uint8") * 255
cv2.imwrite ('./'+"مسح"+'.بي إن جي'، مشوه)

يحافظ حفظ المسح الضوئي بتنسيق PNG على جودة المستند.

عرض الإخراج

إخراج صورة المستند الممسوح ضوئيًا:

cv2.imshow ("الصورة النهائية الممسوحة ضوئيًا"، imutils.resize (مشوه ، ارتفاع =650))
cv2.waitKey (0)
cv2.destroyAllWindows ()

تُظهر الصورة التالية إخراج البرنامج ، لقطة علوية للمستند الممسوح ضوئيًا.

كيف تتقدم في رؤية الكمبيوتر

يغطي إنشاء ماسح ضوئي للوثائق بعض المجالات الأساسية لرؤية الكمبيوتر ، وهو مجال واسع ومعقد. للتقدم في رؤية الكمبيوتر ، يجب أن تعمل على مشاريع مثيرة للاهتمام ولكنها صعبة.

يجب عليك أيضًا قراءة المزيد حول كيفية استخدام رؤية الكمبيوتر مع التقنيات الحالية. سيبقيك هذا على اطلاع ويعطيك أفكارًا جديدة للمشاريع للعمل عليها.