PDA

View Full Version : تکه تکه کردن عکس از روی خطهای رسم شده



krasus
پنج شنبه 27 آذر 1393, 02:31 صبح
سلام
من چند تا فایل pdf دارم که می خوام مطابش رو که با خط های قرمز از هم جداشدند با برنامه تشخیص بدم و این مطالب رو به صورت عکس و جداشده توی پایگاه داده ذخیره کنم.

مثلا :

----------------------------
شابتاشسینتباشستاب
----------------------------
شابنتیاشمبنیامبتاشبی
----------------------------
سشایبکتاسیبنتشاسمب
----------------------------
سشبسیبشسبسیب
----------------------------
متن بالا رو می خوام به چهار تا تکه عکس جدا از هم تبدیل کنم و ذخیره کنم.
کسی راهی به ذهنش میرسه؟
من چطوری می تونم جای خطهای قرمز رو تشخیص بدم تا با rectangle بتونم از روی عکسم عکس بگیرم(مثلا از مطلب بالا چهار تا عکس از قسمتهای بین خطوط قرمز گرفته میشه)؟

krasus
پنج شنبه 04 دی 1393, 22:47 عصر
سلام
مشکلم برای انجام این کار حل شد.
برای این کار پیکسل های عکس رو به صورت یه آرایه دو بعدی در نظر گرفتم و رنگ تمام پیکسل هارو با دوتا حلقه (برای پیمایش در طول و عرض عکس) بررسی کردم. اولش یه مشکل برای تشخیص عکس برام پیش اومد و اونم این بود که من نتونستم با سیسم RGB طیف رنگی مناسبی برای تشخیص رنگ قرمز به برنامه معرفی کنم برای همین از سیستم HSV استفاده کردم.
(البته چون خودم خطهارو به صورت مستقیم رسم کردم دیگه توی کدهام فقط پیکسل های یک ستون رو چک کردم. مثلا x=200 و y ها از بالا تا پایین عکس)
بعد مقدار y پیکسل هایی که طیف رنگیشون به رنگ قرمز می خورد رو ذخیره کردم و از بین این y ها یه کپی توی یه bitmap ذخیره کردم و نهایتا bitmap رو توی یه فایل ذخیره کردم.








Bitmap image1;
public Bitmap CropImage(Bitmap source, int x, int y, int width, int height)
{
Rectangle section = new Rectangle(new Point(x, y), new Size(width, height));


Bitmap bmp = new Bitmap(section.Width, section.Height);


Graphics g = Graphics.FromImage(bmp);




g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel);


return bmp;
}








try
{
string Yha = "";
int oldy = 0;


if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);


try
{
string[] pics = openFileDialog1.FileNames;
Image frame1 = Image.FromFile(pics[0]);
var bitmap1 = new Bitmap(frame1, 990, ((frame1.Height * 990) / frame1.Width));
pictureBox1.Image = bitmap1;


for (int i = 1; i < pics.Length; i++)
{
int wi1 = pictureBox1.Width;
int he1 = pictureBox1.Height;
Image frame = pictureBox1.Image;
Image playbutton = Image.FromFile(pics[i]);
Bitmap bitmap = new Bitmap(frame.Width, frame.Height + ((playbutton.Height * 990) / playbutton.Width));
Graphics canvas = Graphics.FromImage(bitmap);
canvas.InterpolationMode = InterpolationMode.NearestNeighbor;
canvas.DrawImage(frame, new Rectangle(0, 0, 990, frame.Height), new Rectangle(0, 0, frame.Width, frame.Height), GraphicsUnit.Pixel);
canvas.DrawImage(playbutton, new Rectangle(0, frame.Height, 990, ((playbutton.Height * 990) / playbutton.Width)), new Rectangle(0, 0, playbutton.Width, playbutton.Height), GraphicsUnit.Pixel);
canvas.Save();


pictureBox1.Image = bitmap;
}


pictureBox1.Image.Save("PictureOfQuizForEdit.bmp", ImageFormat.Bmp);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


image1 = (Bitmap)pictureBox1.Image;
Color pixelColor1 = Color.White;


for (int y = 0; y < pictureBox1.Image.Height; y++)
{
pixelColor1 = image1.GetPixel(250, y);
if ((int)pixelColor1.GetSaturation() > 30)
{
MessageBox.Show(pixelColor1.GetSaturation().ToStri ng());
}
if ((pixelColor1.GetHue() > 320 || pixelColor1.GetHue() < 40) && (pixelColor1.GetSaturation() * 100) > 30 && (pixelColor1.GetBrightness() * 100) > 30)
{
if (y - oldy > 10)
{
Yha += y.ToString() + "#";
oldy = y;
}
}
}






if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string[] mokhtasateYha = Yha.Split('#');
string savePath = saveFileDialog1.FileName.Substring(0, saveFileDialog1.FileName.LastIndexOf('\\'));
for (int i = 0; i < mokhtasateYha.Length; i++)
{
int y = 0;
if (i != 0)
{
y = Convert.ToInt32(mokhtasateYha[i - 1]);
}
int height = 0;
if (i == mokhtasateYha.Length - 1)
{
height = pictureBox1.Image.Height - Convert.ToInt32(mokhtasateYha[i - 1]);
}
else
{
height = (Convert.ToInt32(mokhtasateYha[i]) - (i == 0 ? 0 : (Convert.ToInt32(mokhtasateYha[i - 1]))));
}


Bitmap slicePic = CropImage((Bitmap)pictureBox1.Image, 0, y + 2, pictureBox1.Image.Width, height - 3);


slicePic.Save(savePath + '\\' + "number" + (i + 1).ToString() + ".jpg");
}
}
}
}
catch (ArgumentException ex)
{
MessageBox.Show(ex.Message);
}