الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تنبيه ] شرح طريقة تحليل رسم بياني بين صورتين

بدأه -Ahmed Hassan في 8 يوليو 2011 · 2 رد · 3,530 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أنا بكتب برنامج عبارة عن برنامج يعمل generate لاسئلة للرياضيات للجامعة إلي أنا فيها.

فه كل طالب بيجلو سؤال مختلف عن الطلاب إلي فيه الفصل.

فمثلا

ما هي إجابة 1+1 ؟

البرنامج حيكون مكتوب كدة قبل ما الطالب يجلو السؤال .

ما هي اجابه س+ص؟

س و ص هم عبارة عن variables حكون أنا محدد الدومين بتعهم.

الطالب المفروض أني يقول الاجابة عن السؤال و البرنامج يعمل evaluation للإجابة و يقرنها بمثلاً مجموع س + ص.

وجهتني مشكلة أن أستاذ الجامعة عاوز برضه أن الطلاب يستطع أن يرفعه رسم بياني و أن المفروض البرنامج يصحح الرسم :huh:

أول فكرة أتت فيه دمغي أن الطالب يرفع الرسم بتعه و أن أنا أخد hash بمثلاً md5 و اقرانها بالصورة.

طبعاً لو الطلب كح فيه الصوره، ال-hash حيكون مختلف. ساعتها الأجبه حتكون غلط.

قلت أدوار على حل تاني.

الرسم البيني إلي الطالب المفروض حيكون حيتعمله generate بال-python. أنا كل علي عليه أني أشوف و أقارن الرسم إلي الطالب حيعمله upload بالرسم إلي معمولة generate.

خد عندك الرسم دة.

xmkUG.png

ده دلة cos x من -5 إلى 5

الطالب المفروض أنه يرفع الصوره ده و علها الأسم بتعه.

مثال

L1zYk.png

طبعاً اه الحل هنا؟

نحولهم إلى ماتريكس

و نقارن كل بيكسل ببيكسل و نشوف هل هما شبة بعد ولا لأ.

الأول احنا محتجين ننزل المكتبات الاتية

numpy

PIL

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

أنت نزلته؟؟

كويس، يلا نجرب ال-library و نتأكد أنها شغالة.

In [1]: from PIL import Image

مفيش أي exception errors يبقي ال-library نزلت كويس. :lol:

حط الصور فيه ال-directory إلي إنت حتشغل فيه, ليتم عمليه التسهيل مش أكتر عليك.

In [2]: ls
1.png  cosX.png

بنستخدم الدلة open علشان نفتح الصور من python

In [3]: image1= Image.open("cosX.png")


In [4]: image2= Image.open("1.png")

لو أنت عاوز تشوف معلومات عن الكائن ألي أنت لسه فتحه، ممكن تكتب image1 و image2 فيه الشل علشان تعرف المعلومات عن الصور.

In [5]: image2
Out[5]: <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=484x316 at 0x9FDB78C>

In [6]: image1
Out[6]: <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=484x316 at 0x9FD118C>

طبعاً زي ما أنتم شيفين، الصورتين ألوان. لو حولنهم لمتركس حيكون فيه معلومات عن الألوان ده بكثرة.

و حيكون عندنا ألوان كثرة للمقرنة. دة حيصعب المسأله. احنا عاوزين المسألة تكون سهلا شوية

مثال.

لو أنت عندك الصورة ده

laugh.gif

(أيوا صوره الراجل ألي بيضحك )

لو فتحتها ب-PIL و حولتها ل-matrix. حيكون هو دة الناتج

In [7]: gif= Image.open("laugh.gif")

In [8]: import numpy

In [9]: matgif=numpy.asarray(gif)

ده ال-matrix بتعة ال-smiley face ألي أنا فتحث

In [11]: matgif
Out[11]: 
array([[15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15],
       [15, 15, 15, 15, 15,  7,  1,  5, 11,  4,  4, 11,  5,  1,  7, 15, 15,
        15, 15, 15],
       [15, 15, 15, 15, 14,  5,  4,  2, 12,  3,  3, 12,  6,  4,  5, 14, 15,
        15, 15, 15],
       [15, 15, 15,  1, 11,  6,  9,  9,  9,  9,  9,  9,  3,  3,  6, 11,  1,
        15, 15, 15],
       [15, 15, 14,  4, 12,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  2,  4,
        14, 15, 15],
       [15,  7, 10,  2,  9,  9, 13, 13,  9,  9,  9, 13, 13,  9,  3,  3,  6,
        10,  7, 15],
       [15,  1,  4,  9,  9, 13,  9,  9, 13,  9, 13,  9,  9, 13,  9,  3, 12,
         4,  1, 15],
       [15,  5,  2,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,
         6,  5, 15],
       [15, 11, 12,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,
         2, 11, 15],
       [15,  4,  3,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,
        12,  4, 15],
       [15,  4,  3,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  3,  3,
        12,  4, 15],
       [15, 11, 12,  9,  9, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  3, 12,
         2, 11, 15],
       [15,  5,  6,  3,  9, 13,  0,  0,  0,  0,  0,  0,  0,  0, 13,  3, 12,
         6,  5, 15],
       [15,  1,  4,  3,  9, 13, 13,  0,  0,  0,  0,  0,  0, 13, 13, 12, 12,
         4,  1, 15],
       [15,  7, 10,  6,  3,  3, 13, 13,  0,  8,  8,  0, 13, 13, 12, 12,  6,
        10,  7, 15],
       [15, 15, 14,  4,  2,  3,  3, 13, 13, 13, 13, 13, 13, 12, 12,  6,  4,
        14, 15, 15],
       [15, 15, 15,  1, 11,  6, 12,  3,  3,  3,  3, 12, 12, 12,  6, 11,  1,
        15, 15, 15],
       [15, 15, 15, 15, 14,  5,  4,  6,  2, 12, 12,  2,  6,  4,  5, 14, 15,
        15, 15, 15],
       [15, 15, 15, 15, 15,  7,  1,  5, 11, 13, 13, 11,  5,  1,  7, 15, 15,
        15, 15, 15],
       [15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15]], dtype=uint8)

طبعاً فيه أنواع لأنظمة الألوان. احنا عاوزين نبقى عارفين إيه الألوان ألي احنا حنشتغل بها.

فعلشان كدة، احنا حنحاول كل حاجة أبيض و أسود لتسهيل عمليت التحليل

In [12]: gifbw=Image.open("laugh.gif")

In [13]: gifbw=gi
gif    gifbw  

In [13]: gifbw=gifbw.convert("L")

In [14]: matgifbw=numpy.asar
numpy.asarray            numpy.asarray_chkfinite  

In [14]: matgifbw=numpy.asarray(gi
gif    gifbw  

In [14]: matgifbw=numpy.asarray(gifbw)

ده الصورة بعد عملية التحويل

Jm7pO.gif

و ده slice من الماتريكس إلي أنا حولتها

In [19]: matgif[6]
Out[19]: 
array([15,  1,  4,  9,  9, 13,  9,  9, 13,  9, 13,  9,  9, 13,  9,  3, 12,
        4,  1, 15], dtype=uint8)

In [44]: matgif[6][1]
Out[44]: 1

دة كان السبب الأول.

السبب التاني هو الأتي:

فيه نظام من انظم الألوان لم بتجي بتحولها لمتركس، بتديك متركس 3d.

بمعنه أن صورة طول x عرض x عمق.

دة حكون غبي شوية فيه ال-algorithm إلي أنت حتكتبهة.

شوف المثال الأتي

أنا حنزل الصورة ده و سوف يتم فتحها ب-PIL

ده هي الصورة

http://i.imgur.com/7UZ1M.jpg

In [45]: color= Image.open("color.jpg")

In [46]: colorMatrix= numpy.asarray(color)

In [48]: colorMatrix
Out[48]: 
array([[[  6, 172, 224],
        [  8, 173, 231],
        [  0, 159, 221],
        ..., 
        [154,   2,  51],
        [176,   2,  74],
        [206,   0,  96]],
....
....
reduced

In [49]: colorMatrix[0]
Out[49]: 
array([[  6, 172, 224],
       [  8, 173, 231],
       [  0, 159, 221],
       ..., 
       [154,   2,  51],
       [176,   2,  74],
       [206,   0,  96]], dtype=uint8)

In [50]: colorMatrix[0][0]
Out[50]: array([  6, 172, 224], dtype=uint8)

In [51]: colorMatrix[0][0][0]
Out[51]: 6

ولكن إذا تم تحويل الألوان إلى أبيض و أسود حيكون الناتجة كى الأتي

In [52]: colorBW= color.convert("L")

In [53]: colorBW_Matrix= numpy.asar
numpy.asarray            numpy.asarray_chkfinite  

In [53]: colorBW_Matrix= numpy.asarray(colo
color        colorBW      colorMatrix  colorbw      colormat     

In [53]: colorBW_Matrix= numpy.asarray(colorBW)

In [54]: colorBW_Matrix
Out[54]: 
array([[128, 130, 118, ...,  53,  62,  72],
       [128, 130, 118, ...,  53,  62,  72],
       [128, 130, 118, ...,  53,  62,  72],
       ..., 
       [113, 112, 108, ...,  59,  65,  63],
       [113, 112, 108, ...,  59,  65,  63],
       [113, 112, 108, ...,  59,  65,  63]], dtype=uint8)

In [55]: colorBW_Matrix[0]
Out[55]: array([128, 130, 118, ...,  53,  62,  72], dtype=uint8)

In [56]: colorBW_Matrix[0][0]
Out[56]: 128

فعلشان كدة الأحسن اننا نحول كل شئ إلى أبيض و أسود.

نرجع تاني إلى الموضوع الأساسي.

احنا عندنا الصورة ده. و عاوزين نقرنها بالصور إلي الطلب حيعملهة upload.

ده الصوره

xmkUG.png

أول حاجة حتعمل ان حيتم تحويل الصورة إلى أبيض و أسود.

و دة بيتعمل بالدلة convert.

In [58]: generatedGraph= Image.open("1.png")

In [59]: generatedGraph=generatedGraph.convert("L")

In [60]:

كل صورة عبارة عن 2d array أو matrix بعرض و طول. و كل عرض و طول بيمثل عدد ال-pixels فيه الصوره.

يعني لم تلقي صورة 640x480 دة معناها أن عرض الصورة فيه 640 نقطة مضروبة فيه 480 نقطة.

يعني حجم ال-2d array حيكون حصل درب الرقمين دول.

يعني لو صورة حجمها 640x480 حتكون فيها

307200

نقطة

alalgorthm بتعتني حتعدي على كل نقطة أو pixel و تقرنها بالصورة إلي أنت عاوز تقرنها بها.

و فيه نفس الوقت حيكون فيه counter حيعد حصل ضرب عدد ال-pixels إلي هي مسوية لعدد ال-pixel فيه الصورة إلي أنت عاوز تقرنها بها.

و فيه الأخر حنقسم الرقم دة على ال-counter و حيتم ضربه فيه 100 علشان تطلع نسبة مئوية.

طبعاً لو أنت شيف ال-graph فيه نسبة لون أبيض كبيرة. فعلشان كدة، سوف يتم تجاهل الألوان البيضاء من ال-generated image

شيء أخر:

عندما يتم تحويل الألوان إلي أبيض و أسود.

درجه الألوان بتوحول إلى أرقام ما بين 0 و 255

0 معناها اللون الأسود

255 معناها اللون الأبيض

أي ألوان فيه النص ده بتكون درجه بتعته ما بين أبيض و أسود.

بمعاني:

لو عندك فيه ال-matrix الرقم دة 200 دة معناها لون أبيض غامق بدرجة بسيطة.

لو أنت عندك الرقم دة 30 فيه ال-matrix دة معناها أنه لون أسود و فاتح بدرجة بسيطة

ده ال-function المسؤلة عن مقرنة الرسم البياني

#    This file is a part of MatWork Project
#    Copyright (C) 2011  Ahmed Hassan
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

from __future__ import division
# try
from PIL import Image
import numpy
# catch import error

def gradeGraph (source,copy):
    srcImg = Image.open(source)
    cpyImg   = Image.open(copy)
    srcImg = srcImg.convert("L")
    cpyImg   = cpyImg.convert("L")
    if srcImg.size != cpyImg.size:
        print "Error: The source is not like the copy"           ##rise an error in Django
        return
    srcImgMat= numpy.asarray(srcImg)
    cpyImgMat= numpy.asarray(cpyImg)

    AllNonWhiteBG=0
    srcN=0
    for srcItr,cpyItr in zip(srcImgMat,cpyImgMat):
        for srcItr2,cpyItr2 in zip(srcItr,cpyItr):
            if srcItr2 == 255:
                continue
            AllNonWhiteBG+=1
            if srcItr2 == cpyItr2:
                srcN+=1
    similarity=(srcN/AllNonWhiteBG) * 100
    return similarity

دعونا نحاول تشغلها

gen.png

8mFfe.png

cosX.png

WdaWA.png

In [1]: from graphTest import *

In [2]: gradeGraph("gen.png","cosX.png")
Out[2]: 100.0

التشابه هنا نسبته 100%

لو جربنا مثلاً sin بدل cos

sinX.png

9fzGH.png

In [3]: gradeGraph("gen.png","sinX.png")
Out[3]: 49.406424581005588

التشابه هنا نسبته 49%

و دة معناها أن الطلب رفع إجابة غلط

لو فيه أي حد عنده أي اسئله، تفضل بطرحها هنا

تم تعديل هذه المشاركة بواسطة -Ahmed Hassan في 8 يوليو 2011 في 08:15

2

وَمَا أُوتِيتُمْ مِنْ الْعِلْمِ إِلاَّ قَلِيلاً

#2

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

#3

*- يحظر استخدام اللهجة العامية

*- أو كتابة الأسئلة باللغة الإنجليزية

*- أو كتابة الكلمات الإنجليزية بالعربية

====

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…