c# मैट्रिक्स/सी#में परिवर्तन समन्वय



image matrix (1)

मेरे पास निर्देशांक है जो एक छवि पर ज्ञात पदों को प्रतिबिंबित करता है। चलो यह टेम्पलेट छवि को कॉल करते हैं। इसमें एक अद्वितीय बारकोड और अभिविन्यास मार्कर हैं (जो समन्वय सरणी में भी हैं)

चित्र को छपी, स्कैन और अपने आवेदन में वापस पता लगाया जा सकता है। मुद्रण और स्कैनिंग के दौरान, छवि को तीन तरीकों से बदल दिया जा सकता है; अनुवाद, रोटेशन और स्केल

यह मानते हुए कि मैं विकृत छवि पर अभिविन्यास मार्कर ढूंढ सकता हूं, मैं शेष निर्देशांक के रिश्तेदार पदों को प्राप्त करने के लिए मैट्रिक्स परिवर्तन का उपयोग कैसे कर सकता हूं?

मैंने इस सवाल पर पहले ही पोस्ट किया था लेकिन यह समझने में बहुत जटिल था कि मैं क्या चाहता हूं।

संपादित करें

namespace MatrixTest
{
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections.Generic;

public static class Program
{
public static void Main ()
{
Template template = new Template(); // Original template image.
Document document = new Document(); // Printed and scanned distorted image.

template.CreateTemplateImage();

// The template image is printed and scanned. This method generates an example scan or this question.
document.CreateDistortedImageFromTemplateImage();
// Stuck here.
document.Transform();
// Draw transformed points on the image to verify that transformation is successful.
document.DrawPoints();

System.Diagnostics.Process.Start(new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).Directory.FullName);
}
}

public class Page
{
public Bitmap Image { get; set; }
public Point[] Markers = new Point[3]; // Orientation markers: 1=TopLeft, 2=TopRight, 3=BottomRight.
public Point[] Points = new Point[100]; // Coordinates to transform in the TemplateScanned derived class!
}

// This class represents the originalk template image.
public class Template: Page
{
public Template ()
{
this.Image = new Bitmap(300, 400);

// Known dimentions for marker rectangles.
this.Markers[0] = new Point(10, 10);
this.Markers[1] = new Point(this.Image.Width - 20 - 10, 10);
this.Markers[2] = new Point(this.Image.Width - 20 - 10, this.Image.Height - 20 - 10);

// Known points of interest. Consider them hardcoded.
int index = 0;
for (int y = 0; y < 10; y++)
for (int x = 0; x < 10; x++)
this.Points[index++] = new Point((this.Image.Width / 10) + (x * 20), (this.Image.Height / 10) + (y * 20));
}

public void CreateTemplateImage ()
{
using (Graphics graphics = Graphics.FromImage(this.Image))
{
graphics.Clear(Color.White);

for (int i = 0; i < this.Markers.Length; i++)
graphics.FillRectangle(Brushes.Black, this.Markers[i].X, this.Markers[i].Y, 20, 20);

for (int i = 0; i < this.Points.Length; i++)
graphics.DrawRectangle(Pens.Red, this.Points[i].X, this.Points[i].Y, 5, 5);
}

this.Image.Save("Document Original.png");
}
}

// This class represents the scanned image.
public class Document: Page
{
public struct StructTransformation
{
public float AngleOfRotation;
public SizeF ScaleRatio;
public SizeF TranslationOffset;
}

private Template Template = new Template();
private StructTransformation Transformation = new StructTransformation();

public Document ()
{
this.Template = new Template();
this.Transformation = new StructTransformation { AngleOfRotation = 5f, ScaleRatio = new SizeF(.8f, .7f), TranslationOffset = new SizeF(100f, 30f) };

this.Template.CreateTemplateImage();

// Copy points from template.
for (int i = 0; i < this.Template.Markers.Length; i++)
this.Markers[i] = this.Template.Markers[i];

for (int i = 0; i < this.Points.Length; i++)
this.Points[i] = this.Template.Points[i];
}

// Just distorts the original template image as if it had been read from a scanner.
public void CreateDistortedImageFromTemplateImage ()
{
// Distort coordinates.
Matrix matrix = new Matrix();
matrix.Rotate(this.Transformation.AngleOfRotation);
matrix.Scale(this.Transformation.ScaleRatio.Width, this.Transformation.ScaleRatio.Height);
matrix.Translate(this.Transformation.TranslationOffset.Width, this.Transformation.TranslationOffset.Height);
matrix.TransformPoints(this.Markers);
matrix.TransformPoints(this.Points);

// Distort and save image for visual reference.
this.Image = new Bitmap(this.Template.Image.Width, this.Template.Image.Height);
using (Graphics graphics = Graphics.FromImage(this.Image))
{
graphics.Clear(Color.White);
graphics.RotateTransform(this.Transformation.AngleOfRotation);
graphics.ScaleTransform(this.Transformation.ScaleRatio.Width, this.Transformation.ScaleRatio.Height);
graphics.TranslateTransform(this.Transformation.TranslationOffset.Width, this.Transformation.TranslationOffset.Height);
graphics.DrawImage(this.Template.Image, 0, 0);
}
this.Image.Save("Document Scanned.png");
}

public void Transform ()
{
// The rectangles of the ScannedDcoument are not known at this time. They would obviously be relative to the three orientation markers.
//    I can't figure out how to use the following code properly i.e. using Matrix to apply all three transformations.
Matrix matrix = new Matrix();
matrix.Rotate(-this.Transformation.AngleOfRotation);
matrix.Scale(1f/this.Transformation.ScaleRatio.Width, 1f/this.Transformation.ScaleRatio.Height);
matrix.Translate(-this.Transformation.TranslationOffset.Width, -this.Transformation.TranslationOffset.Height);
matrix.TransformPoints(this.Markers);
matrix.TransformPoints(this.Points);
}

public void DrawPoints ()
{
using (Graphics graphics = Graphics.FromImage(this.Image))
{
graphics.Clear(Color.White);

for (int i = 0; i < this.Markers.Length; i++)
graphics.FillRectangle(Brushes.Blue, this.Markers[i].X, this.Markers[i].Y, 20, 20);

for (int i = 0; i < this.Points.Length; i++)
graphics.DrawRectangle(Pens.Purple, this.Points[i].X, this.Points[i].Y, 5, 5);
}
this.Image.Save("Document Fixed.png");
}
}
}

मैं मान रहा हूँ कि आप छवि को इकाई वर्ग ((0, 0) - (1.0, 1.0) में बदलना चाहते हैं) आपको तीन बिंदु चाहिए, एक मूल है, दूसरे को एक्स-एक्स (1.0, 0) और दूसरे को y- अक्ष (0, 1.0)।

मूल समन्वय प्रणाली में:

  • मूल है (बैल, ओए)
  • एक्स-एक्सिस है (एक्स 1, वाई 2)
  • वाई-एक्सिस (एक्स 2, वाई 2) है
  • एक्स-एक्सिस उत्पत्ति के मुताबिक (एक्स 1-ऑक्स, वाई 1-ओए) कम हो जाएगा (आरएक्स 1, आरआई 1)
  • मूल के सापेक्ष वाई-एक्सिस (एक्स 2-बैल, वाई 2-ओए) को छोटा किया जाएगा (आरएक्स 2, आरआई 2)

सबसे पहले हम मूल (0,0) को समरूप समन्वय में बदल देंगे मैट्रिक्स बदल जाएगा

(1   0   -Ox)
(0   1   -Oy)
(0   0    1) 

नई जगह से पुराने को ट्रांसफ़ॉर्मेशन निम्न मैट्रिक्स द्वारा दर्शाया गया है:

(RX1   RX2   0)
(RY1   RY2   0)
( 0    0     1)

क्योंकि आप व्युत्क्रम परिवर्तन चाहते हैं, पुराने स्थान से नए तक, हमें इस मैट्रिक्स को उलटा होना चाहिए: चलो छोटा (RX1 * RY2-RX2 * RY1) को डी के रूप में छोटा करें

(RY2/D   -RX2/D   0)
(-RY2/D   RX1/D   0)
(  0       0      1)

अब आप दोनों मैट्रिक्स को पहले अनुवाद कर सकते हैं और फिर आधार को बदलने के लिए दूसरे मैट्रिक्स का उपयोग कर सकते हैं।





transformation