PDA

View Full Version : خواندن متن از روی عکس Optical character recognition



daniyaltjm
پنج شنبه 02 مرداد 1399, 15:57 عصر
سلام خدمت همه اساتید،

1-توی این تایپیک لطفا بصورت ساده و ابتدایی روش بدست آوردن یک کاراکتر مثلا 'A' رو بصورت مرحله ایی و الگوریتمیک بیان کنید و یک مثال ساده هم در صورت امکان بزنید.

2-حالا مثلا الگوریتم کاراکتر 'A' رو تونست بررسی کنه و تشخیص بده برای کلمه ای مثل "َApple" چطور باید عمل کنه؟

3-چالش های پیش رو چی هستن؟ مثلا اگه پس زمینه غیر سفید یا یک رنگ نباشه و فونت های گوناگون چی؟

لطفا یک مثال توی سی شارپ زده بشه ممنون...

mahdavi1385
چهارشنبه 08 مرداد 1399, 21:08 عصر
دوست عزیز بنظرم شما باید درباره کپچا تحقیق کنید

daniyaltjm
چهارشنبه 08 مرداد 1399, 21:33 عصر
دوست عزیز بنظرم شما باید درباره کپچا تحقیق کنید

کپچا فقط یه عکس هست و ارتباطی به استخراج حروف و اعداد از درون یک تصویر نداره !! کپچا رو برای امنیت سایت ها قرار میدن که فقط انسان بتونه تصویر رو بفهمه و وارد تکست باکس کنه ولی اینجا من دارم از استخراج یک سری الگو مثل یک عدد یا حرف توی یک آرایه دوبعدی از پیکسل حرف میزنم ! لطفا یک بار دیگه صورت مسئله رو مطالعه کنید.

danialafshari
جمعه 10 مرداد 1399, 02:29 صبح
با سلام
برای اینکار میتونید از کتابخانه های آماده استفاده کنید
که معروفترین کتابخانه دات نت هم اگر اشتباه نکنم Tesseract هست که بوسیله charlesw نوشته شده و اگه اشتباه نکنم با دات نت کور هست
میتونید از این لینک Sample ش رو دانلود کنید
https://github.com/charlesw/tesseract-samples
موفق باشید

daniyaltjm
جمعه 10 مرداد 1399, 10:55 صبح
با سلام
برای اینکار میتونید از کتابخانه های آماده استفاده کنید
که معروفترین کتابخانه دات نت هم اگر اشتباه نکنم Tesseract هست که بوسیله charlesw نوشته شده و اگه اشتباه نکنم با دات نت کور هست
میتونید از این لینک Sample ش رو دانلود کنید
https://github.com/charlesw/tesseract-samples
موفق باشید

سلام
لطفا یک بار دیگه سوال رو بخونید من روش کار رو میخوام نه کتابخانه یا پلاگین یا چیز دیگه!!..

1-توی این تایپیک لطفا بصورت ساده و ابتدایی روش بدست آوردن یک کاراکتر مثلا 'A' رو بصورت مرحله ایی و الگوریتمیک بیان کنید و یک مثال ساده هم در صورت امکان بزنید.

mr.sirwan
جمعه 10 مرداد 1399, 12:17 عصر
سلام
لطفا یک بار دیگه سوال رو بخونید من روش کار رو میخوام نه کتابخانه یا پلاگین یا چیز دیگه!!..

1-توی این تایپیک لطفا بصورت ساده و ابتدایی روش بدست آوردن یک کاراکتر مثلا 'A' رو بصورت مرحله ایی و الگوریتمیک بیان کنید و یک مثال ساده هم در صورت امکان بزنید.

اقا شما برو سمت یادگیری ماشین، به چندین روش میتونی اینکارو انجام بدی، 1. طبقه بندی 2. شبکه های عصبی
بصورت خلاصه بخوام برات بگم عملکردش به این شکله که شما اول میای مثلا شبکه عصبیت رو که نوشتی باید آموزشش بدی، برای اینکار برای هر حرف چندتا تصویر در حالت های مختلف بهش میدی و میگی این چندتا تصویر همگی مربوط به حرف A هستن و به همین صورت برای تمامی حروف، بعد از اینکه بهش آموزش دادی، حالا خودش میتونه کاراکترها و حروف رو از توی تصاویر بخونه حتی اگه دست نویس باشن

daniyaltjm
جمعه 10 مرداد 1399, 12:55 عصر
اقا شما برو سمت یادگیری ماشین، به چندین روش میتونی اینکارو انجام بدی، 1. طبقه بندی 2. شبکه های عصبی
بصورت خلاصه بخوام برات بگم عملکردش به این شکله که شما اول میای مثلا شبکه عصبیت رو که نوشتی باید آموزشش بدی، برای اینکار برای هر حرف چندتا تصویر در حالت های مختلف بهش میدی و میگی این چندتا تصویر همگی مربوط به حرف A هستن و به همین صورت برای تمامی حروف، بعد از اینکه بهش آموزش دادی، حالا خودش میتونه کاراکترها و حروف رو از توی تصاویر بخونه حتی اگه دست نویس باشن

ممنون از پاسخت، در حرف آسونه و در عمل یکم دشوار... اگه بشه یک مثال ساده با کد برای همین کاراکتر 'A' بزنی دیگه بقیش کپی میشه برای بقیه حروف البته اینجا حروف انگلیسی رو میخوایم بررسی کنیم و فارسی دشوارتر هست ..... چون حروف چند حالت دارن که هیچی.. حالا مثلا ما یک تصویر داریم که حروف انگلیسی داخلشه مثلا همین 'A' یعنی مثلا 6 تا کاراکتر وجود داره... خب باید تک به تک از تصویر جدا بشن کراپ بشن که بشه با اون تصاویر نمونه بررسی کرد دیگه این چطوری باید توی سی شارپ انجام بشه.؟ این برای حالتی هست که تصویر یک بکراند داره و کاراکتر ها هم یک رنگ مثل فتوشاپ که راحت انتخاب می کنیم... حالا اگه بک گراند یک رنگ نباشه چطور باید جدا کرد ؟ مثلا باید تصویر رو سیاه سفید کرد؟ نگتیو کرد یا چی؟ :متفکر:

mr.sirwan
جمعه 10 مرداد 1399, 13:00 عصر
ممنون از پاسخت، در حرف آسونه و در عمل یکم دشوار... اگه بشه یک مثال ساده با کد برای همین کاراکتر 'A' بزنی دیگه بقیش کپی میشه برای بقیه حروف البته اینجا حروف انگلیسی رو میخوایم بررسی کنیم و فارسی دشوارتر هست ..... چون حروف چند حالت دارن که هیچی.. حالا مثلا ما یک تصویر داریم که حروف انگلیسی داخلشه مثلا همین 'A' یعنی مثلا 6 تا کاراکتر وجود داره... خب باید تک به تک از تصویر جدا بشن کراپ بشن که بشه با اون تصاویر نمونه بررسی کرد دیگه این چطوری باید توی سی شارپ انجام بشه.؟ این برای حالتی هست که تصویر یک بکراند داره و کاراکتر ها هم یک رنگ مثل فتوشاپ که راحت انتخاب می کنیم... حالا اگه بک گراند یک رنگ نباشه چطور باید جدا کرد ؟ مثلا باید تصویر رو سیاه سفید کرد؟ نگتیو کرد یا چی؟ :متفکر:

داداش بحث هوش مصنوعی، یادگیری ماشین و شبکه های عصبی مبحث بسیار پیچیده ایه و خودش یک دنیای کامله و در یک مثال نمیگنجه، شما گفتی راهنمایی کنید، من راهو نشونت دادم که خودت بری دنبالش، تو این تاپیک و حتی فروم نمیگنجه که برای شبکه عصبی برات مثال بزنم، توی اینترنت جستجو کن که بفهمی اصلا قضیه چیه

daniyaltjm
جمعه 10 مرداد 1399, 18:38 عصر
داداش بحث هوش مصنوعی، یادگیری ماشین و شبکه های عصبی مبحث بسیار پیچیده ایه و خودش یک دنیای کامله و در یک مثال نمیگنجه، شما گفتی راهنمایی کنید، من راهو نشونت دادم که خودت بری دنبالش، تو این تاپیک و حتی فروم نمیگنجه که برای شبکه عصبی برات مثال بزنم، توی اینترنت جستجو کن که بفهمی اصلا قضیه چیه

ببخشید مگه می خوایم Red Dead Redemption 2 رو بسازیم!! یه استخراج حروف و کلمه هست دیگه تازه اونم انگلیسی نه فارسی!

خب بگذریم ... لطفا دوستانی که توی پردازش تصویر تخصص دارن پست بذارن ...

یه تصویر ساده داریم که بکگراند سفید هست و حروف سیاه (خیلی ساده) الان چطوری باید این حروف رو استخراج کرد ؟ الان من دورشون رو دستی با Paint قرمز کردم و میخوایم انتخابشون کنیم چطور به کامپیوتر بفهمونیم؟
یکی از راه ها که بفکرم رسیده اینه که دوتا حلقه for تو در تو بذاریم و تمام نقاط سیاه رو انتخاب کنیم و اندیس اون پیکسلها رو توی یک bitmap دیگه ذخیره کنیم ... ولی حالا چطور دورشون رو انتخاب کنیم؟ چون اگه انتخاب نشن، نمیشه کاراکتر ها رو از هم تشخیص داد و اندیس ها قاطی میشه مثلا اون اولی رو انتخاب کنه و با حلقه تمام پیکسل های سیاه رو تشخیص بده و توی یک bitmap ذخیره کنه بعد بره اون کاراکتر بعدی و تا آخر سفید ها رو هم که نادیده بگیره ... الان مشکل اینه که چطور دورشون رو انتخاب بکنیم؟

151985

_behnam_
سه شنبه 14 مرداد 1399, 00:51 صبح
سلام. همونجور که دوستان گفتن برای اینکار نیاز هست که هوش مصنوعی بسازید. یا باید از الگوریتم هاب اماده استفاده کنید یا اینکه الگوریتم طراحی کنید که کار ساده ای نیست. توی مطالب زبان انگلیسی نمونه زیاد هست . برای نمونه اخر هم که فرمودید. شما برای جداسازی کاراکترها سیاه ، باید یه ماتریس دوبعدی درنظر بگیرید، حداکثر و حداقل x و y دور تصاویر رو بدست بیارید. ناخداگاه میبینید که حروف توی یک مربع قرار گرفتن چ‌بعد میتونید مربع مورد نظر رو از تصویر کراپ کنید.

این هم یک منبع زبان انگلیسی


https://www.codeproject.com/Articles/476142/Optical-Character-Recognition

daniyaltjm
چهارشنبه 22 مرداد 1399, 12:43 عصر
بنظرتون با الگوریتم Sobel که برای لبه یابی هست میشه کاراکتر هارو جدا کرد؟ با سوبل قشنگ دور هر چیزی رو با رنگ سفید متمایز میکنه حالا چطور جدا شون کنیم به طوری که ترتیبشون توی کلمات حفظ بشه؟
اینم کد سوبل:
اینم منبع و برنامه به زبان سی شارپ:
http://behsanandish.com/learning/ipsources/%da%a9%d8%af-%d8%a7%d9%84%da%af%d9%88%d8%b1%db%8c%d8%aa%d9%85-sobel%d8%b3%d9%88%d8%a8%d9%84-%d8%af%d8%b1-%d8%b2%d8%a8%d8%a7%d9%86-matlab-c-vbcc/


کد الگوریتم سوبل( Sobel ) در #C:


using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;


namespace SobelOperator
{
public partial class Sobel : Form
{


OpenFileDialog ofd;
SaveFileDialog sfd;
Bitmap bmp;


public Sobel()
{
InitializeComponent();
ofd = new OpenFileDialog();
sfd = new SaveFileDialog();
}

private Bitmap cbmp
{
get
{
if (bmp == null)
{
bmp = new Bitmap(1, 1);
}
return bmp;
}
set
{
bmp = value;
}
}


private void save(string filepath)
{
if (System.IO.File.Exists(filepath))
{
System.IO.File.Delete(filepath);
}
bmp.Save(filepath);
}


//Sobel operator kernel for horizontal pixel changes
private static double[,] xSobel
{
get
{
return new double[,]
{
{ -1, 0, 1 },
{ -2, 0, 2 },
{ -1, 0, 1 }
};
}
}


//Sobel operator kernel for vertical pixel changes
private static double[,] ySobel
{
get
{
return new double[,]
{
{ 1, 2, 1 },
{ 0, 0, 0 },
{ -1, -2, -1 }
};
}
}


private static Bitmap ConvolutionFilter(Bitmap sourceImage, double[,] xkernel, double[,] ykernel, double factor = 1, int bias = 0, bool grayscale = false)
{


//Image dimensions stored in variables for convenience
int width = sourceImage.Width;
int height = sourceImage.Height;


//Lock source image bits into system memory
BitmapData srcData = sourceImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);


//Get the total number of bytes in your image - 32 bytes per pixel x image width x image height -> for 32bpp images
int bytes = srcData.Stride * srcData.Height;


//Create byte arrays to hold pixel information of your image
byte[] pixelBuffer = new byte;
byte[] resultBuffer = new byte[bytes];


//Get the address of the first pixel data
IntPtr srcScan0 = srcData.Scan0;


//Copy image data to one of the byte arrays
Marshal.Copy(srcScan0, pixelBuffer, 0, bytes);


//Unlock bits from system memory -> we have all our needed info in the array
sourceImage.UnlockBits(srcData);


//Convert your image to grayscale if necessary
if (grayscale == true)
{
float rgb = 0;
for (int i = 0; i < pixelBuffer.Length; i += 4)
{
rgb = pixelBuffer[i] * .21f;
rgb += pixelBuffer[i + 1] * .71f;
rgb += pixelBuffer[i + 2] * .071f;
pixelBuffer[i] = (byte)rgb;
pixelBuffer[i + 1] = pixelBuffer[i];
pixelBuffer[i + 2] = pixelBuffer[i];
pixelBuffer[i + 3] = 255;
}
}


//Create variable for pixel data for each kernel
double xr = 0.0;
double xg = 0.0;
double xb = 0.0;
double yr = 0.0;
double yg = 0.0;
double yb = 0.0;
double rt = 0.0;
double gt = 0.0;
double bt = 0.0;


//This is how much your center pixel is offset from the border of your kernel
//Sobel is 3x3, so center is 1 pixel from the kernel border
int filterOffset = 1;
int calcOffset = 0;
int byteOffset = 0;


//Start with the pixel that is offset 1 from top and 1 from the left side
//this is so entire kernel is on your image
for (int OffsetY = filterOffset; OffsetY < height - filterOffset; OffsetY++)
{
for (int OffsetX = filterOffset; OffsetX < width - filterOffset; OffsetX++)
{
//reset rgb values to 0
xr = xg = xb = yr = yg = yb = 0;
rt = gt = bt = 0.0;


//position of the kernel center pixel
byteOffset = OffsetY * srcData.Stride + OffsetX * 4;


//kernel calculations
for (int filterY = -filterOffset; filterY <= filterOffset; filterY++)
{
for (int filterX = -filterOffset; filterX <= filterOffset; filterX++)
{
calcOffset = byteOffset + filterX * 4 + filterY * srcData.Stride;
xb += (double)(pixelBuffer[calcOffset]) * xkernel[filterY + filterOffset, filterX + filterOffset];
xg += (double)(pixelBuffer[calcOffset + 1]) * xkernel[filterY + filterOffset, filterX + filterOffset];
xr += (double)(pixelBuffer[calcOffset + 2]) * xkernel[filterY + filterOffset, filterX + filterOffset];
yb += (double)(pixelBuffer[calcOffset]) * ykernel[filterY + filterOffset, filterX + filterOffset];
yg += (double)(pixelBuffer[calcOffset + 1]) * ykernel[filterY + filterOffset, filterX + filterOffset];
yr += (double)(pixelBuffer[calcOffset + 2]) * ykernel[filterY + filterOffset, filterX + filterOffset];
}
}


//total rgb values for this pixel
bt = Math.Sqrt((xb * xb) + (yb * yb));
gt = Math.Sqrt((xg * xg) + (yg * yg));
rt = Math.Sqrt((xr * xr) + (yr * yr));


//set limits, bytes can hold values from 0 up to 255;
if (bt > 255) bt = 255;
else if (bt < 0) bt = 0;
if (gt > 255) gt = 255;
else if (gt < 0) gt = 0;
if (rt > 255) rt = 255;
else if (rt < 0) rt = 0;


//set new data in the other byte array for your image data
resultBuffer[byteOffset] = (byte)(bt);
resultBuffer[byteOffset + 1] = (byte)(gt);
resultBuffer[byteOffset + 2] = (byte)(rt);
resultBuffer[byteOffset + 3] = 255;
}
}


//Create new bitmap which will hold the processed data
Bitmap resultImage = new Bitmap(width, height);


//Lock bits into system memory
BitmapData resultData = resultImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);


//Copy from byte array that holds processed data to bitmap
Marshal.Copy(resultBuffer, 0, resultData.Scan0, resultBuffer.Length);


//Unlock bits from system memory
resultImage.UnlockBits(resultData);


//Return processed image
return resultImage;
}


private void btnLoad_Click(object sender, EventArgs e)
{
if (ofd.ShowDialog() == DialogResult.OK)
{
bmp = (Bitmap)Bitmap.FromFile(ofd.FileName);
AutoScroll = true;
AutoScrollMinSize = new Size(Convert.ToInt32(bmp.Width), Convert.ToInt32(bmp.Height));
Invalidate();
}
}


private void btnSave_Click(object sender, EventArgs e)
{
if (sfd.ShowDialog() == DialogResult.OK)
{
save(sfd.FileName);
}
}


private void btnSobel_Click(object sender, EventArgs e)
{
bmp = ConvolutionFilter(bmp, xSobel, ySobel, 1.0, 0, true);
Invalidate();
}


private void Display(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(cbmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
}
}
}




[B]همه این کد در اینجا موجود است (پروژه با ویژوال استودیو ۲۰۱۵ ایجاد شد):
SobelOperatorInC#‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎ (http://behsanandish.com/wp-content/uploads/SobelOperatorInC.rar)
رمز فایل : behsanandish.com