السلام عليكم
أنا بكتب برنامج عبارة عن برنامج يعمل generate لاسئلة للرياضيات للجامعة إلي أنا فيها.
فه كل طالب بيجلو سؤال مختلف عن الطلاب إلي فيه الفصل.
فمثلا
ما هي إجابة 1+1 ؟
البرنامج حيكون مكتوب كدة قبل ما الطالب يجلو السؤال .
ما هي اجابه س+ص؟
س و ص هم عبارة عن variables حكون أنا محدد الدومين بتعهم.
الطالب المفروض أني يقول الاجابة عن السؤال و البرنامج يعمل evaluation للإجابة و يقرنها بمثلاً مجموع س + ص.
وجهتني مشكلة أن أستاذ الجامعة عاوز برضه أن الطلاب يستطع أن يرفعه رسم بياني و أن المفروض البرنامج يصحح الرسم :huh:
أول فكرة أتت فيه دمغي أن الطالب يرفع الرسم بتعه و أن أنا أخد hash بمثلاً md5 و اقرانها بالصورة.
طبعاً لو الطلب كح فيه الصوره، ال-hash حيكون مختلف. ساعتها الأجبه حتكون غلط.
قلت أدوار على حل تاني.
الرسم البيني إلي الطالب المفروض حيكون حيتعمله generate بال-python. أنا كل علي عليه أني أشوف و أقارن الرسم إلي الطالب حيعمله upload بالرسم إلي معمولة generate.
خد عندك الرسم دة.

ده دلة cos x من -5 إلى 5
الطالب المفروض أنه يرفع الصوره ده و علها الأسم بتعه.
مثال

طبعاً اه الحل هنا؟
نحولهم إلى ماتريكس
و نقارن كل بيكسل ببيكسل و نشوف هل هما شبة بعد ولا لأ.
الأول احنا محتجين ننزل المكتبات الاتية
مش حشرح طريقة تنزلهم لأن 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>
طبعاً زي ما أنتم شيفين، الصورتين ألوان. لو حولنهم لمتركس حيكون فيه معلومات عن الألوان ده بكثرة.
و حيكون عندنا ألوان كثرة للمقرنة. دة حيصعب المسأله. احنا عاوزين المسألة تكون سهلا شوية
مثال.
لو أنت عندك الصورة ده
![]()
(أيوا صوره الراجل ألي بيضحك )
لو فتحتها ب-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)ده الصورة بعد عملية التحويل

و ده 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
ده هي الصورة
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]],
....
....
reducedIn [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.
ده الصوره

أول حاجة حتعمل ان حيتم تحويل الصورة إلى أبيض و أسود.
و دة بيتعمل بالدلة 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

cosX.png

In [1]: from graphTest import *
In [2]: gradeGraph("gen.png","cosX.png")
Out[2]: 100.0التشابه هنا نسبته 100%
لو جربنا مثلاً sin بدل cos
sinX.png

In [3]: gradeGraph("gen.png","sinX.png")
Out[3]: 49.406424581005588التشابه هنا نسبته 49%
و دة معناها أن الطلب رفع إجابة غلط
لو فيه أي حد عنده أي اسئله، تفضل بطرحها هنا