OpenCVSharp #10
نویسنده: وحید نصیری
تاریخ: ۱۳۹۴/۰۳/۲۱ ۱۶:۴۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
private static void updateBrightnessContrast(Mat src, Mat modifiedSrc, int brightness, int contrast)
{
brightness = brightness - 100;
contrast = contrast - 100;
double alpha, beta;
if (contrast > 0)
{
double delta = 127f * contrast / 100f;
alpha = 255f / (255f - delta * 2);
beta = alpha * (brightness - delta);
}
else
{
double delta = -128f * contrast / 100;
alpha = (256f - delta * 2) / 255f;
beta = alpha * brightness + delta;
}
src.ConvertTo(modifiedSrc, MatType.CV_8UC3, alpha, beta);
} using (var src = new Mat(@"..\..\Images\Penguin.Png", LoadMode.AnyDepth | LoadMode.AnyColor))
{
using (var sourceWindow = new Window("Source", image: src,
flags: WindowMode.AutoSize | WindowMode.FreeRatio))
{
using (var histogramWindow = new Window("Histogram",
flags: WindowMode.AutoSize | WindowMode.FreeRatio))
{
var brightness = 100;
var contrast = 100;
var brightnessTrackbar = sourceWindow.CreateTrackbar(
name: "Brightness", value: brightness, max: 200,
callback: pos =>
{
brightness = pos;
updateImageCalculateHistogram(sourceWindow, histogramWindow, src, brightness, contrast);
});
var contrastTrackbar = sourceWindow.CreateTrackbar(
name: "Contrast", value: contrast, max: 200,
callback: pos =>
{
contrast = pos;
updateImageCalculateHistogram(sourceWindow, histogramWindow, src, brightness, contrast);
});
brightnessTrackbar.Callback.DynamicInvoke(brightness);
contrastTrackbar.Callback.DynamicInvoke(contrast);
Cv2.WaitKey();
}
}
}
private static void calculateHistogram1(Window histogramWindow, Mat src, Mat modifiedSrc)
{
const int histogramSize = 64;
int[] dimensions = { histogramSize }; // Histogram size for each dimension
Rangef[] ranges = { new Rangef(0, histogramSize) }; // min/max
using (var histogram = new Mat())
{
Cv2.CalcHist(
images: new[] { modifiedSrc },
channels: new[] { 0 },
mask: null,
hist: histogram,
dims: 1,
histSize: dimensions,
ranges: ranges);
using (var histogramImage = (Mat)(Mat.Ones(rows: src.Rows, cols: src.Cols, type: MatType.CV_8U) * 255))
{
// Scales and draws histogram
Cv2.Normalize(histogram, histogram, 0, histogramImage.Rows, NormType.MinMax);
var binW = Cv.Round((double)histogramImage.Cols / histogramSize);
var color = Scalar.All(100);
for (var i = 0; i < histogramSize; i++)
{
Cv2.Rectangle(histogramImage,
new Point(i * binW, histogramImage.Rows),
new Point((i + 1) * binW, histogramImage.Rows - Cv.Round(histogram.Get<float>(i))),
color,
-1);
}
histogramWindow.Image = histogramImage;
}
}
}