mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
2.9 KiB
129 lines
2.9 KiB
#! /usr/bin/env octave |
|
cv; |
|
highgui; |
|
|
|
file_name = "../c/baboon.jpg"; |
|
|
|
global Gbrightness; |
|
global Gcontrast; |
|
global hist_size; |
|
global ranges; |
|
global src_image; |
|
global dst_image; |
|
global hist_image; |
|
global hist; |
|
global lut; |
|
|
|
_brightness = 100; |
|
_contrast = 100; |
|
Gbrightness = 100; |
|
Gcontrast = 100; |
|
|
|
hist_size = 64; |
|
range_0={0,256}; |
|
ranges = { range_0 }; |
|
src_image=[]; |
|
dst_image=[]; |
|
hist_image=[]; |
|
hist=[]; |
|
lut=cvCreateMat(256,1,CV_8U); |
|
|
|
## brightness/contrast callback function |
|
function update_brightness( val ) |
|
global Gbrightness # global tag is required, or we get UnboundLocalError |
|
Gbrightness = val; |
|
update_brightcont( ); |
|
endfunction |
|
|
|
function update_contrast( val ) |
|
global Gcontrast; # global tag is required, or we get UnboundLocalError |
|
Gcontrast = val; |
|
update_brightcont( ); |
|
endfunction |
|
|
|
function update_brightcont() |
|
global Gbrightness; |
|
global Gcontrast; |
|
global hist_size; |
|
global ranges; |
|
global src_image; |
|
global dst_image; |
|
global hist_image; |
|
global hist; |
|
global lut; |
|
global cvCalcHist; # use cv namespace for these instead |
|
global cvZero; |
|
global cvScale; |
|
|
|
brightness = Gbrightness - 100; |
|
contrast = Gcontrast - 100; |
|
max_value = 0; |
|
|
|
## The algorithm is by Werner D. Streidt |
|
## (http://visca.com/ffactory/archives/5-99/msg00021.html) |
|
if( contrast > 0 ) |
|
delta = 127.*contrast/100; |
|
a = 255./(255. - delta*2); |
|
b = a*(brightness - delta); |
|
else |
|
delta = -128.*contrast/100; |
|
a = (256.-delta*2)/255.; |
|
b = a*brightness + delta; |
|
endif |
|
|
|
for i=0:256-1, |
|
v = cvRound(a*i + b); |
|
if( v < 0 ) |
|
v = 0; |
|
endif |
|
if( v > 255 ) |
|
v = 255; |
|
endif |
|
lut(i) = v; |
|
endfor |
|
|
|
cvLUT( src_image, dst_image, lut ); |
|
cvShowImage( "image", dst_image ); |
|
|
|
cvCalcHist( dst_image, hist, 0, [] ); |
|
cvZero( dst_image ); |
|
[min_value, max_value] = cvGetMinMaxHistValue( hist ); |
|
cvScale( hist.bins, hist.bins, double(hist_image.height)/max_value, 0 ); |
|
##cvNormalizeHist( hist, 1000 ); |
|
|
|
cvSet( hist_image, cvScalarAll(255)); |
|
bin_w = cvRound(double(hist_image.width)/hist_size); |
|
|
|
for i=0:hist_size-1, |
|
cvRectangle( hist_image, cvPoint(i*bin_w, hist_image.height), cvPoint((i+1)*bin_w, hist_image.height - cvRound(cvGetReal1D(hist.bins,i))), cvScalarAll(0), -1, 8, 0 ); |
|
endfor |
|
|
|
cvShowImage( "histogram", hist_image ); |
|
endfunction |
|
|
|
|
|
## Load the source image. HighGUI use. |
|
if size(argv, 1)>1 |
|
file_name = argv(){1} |
|
endif |
|
|
|
src_image = cvLoadImage( file_name, 0 ); |
|
|
|
if (!swig_this(src_image)) |
|
printf("Image was not loaded.\n"); |
|
exit(-1); |
|
endif |
|
|
|
|
|
dst_image = cvCloneImage(src_image); |
|
hist_image = cvCreateImage(cvSize(320,200), 8, 1); |
|
hist = cvCreateHist({hist_size}, CV_HIST_ARRAY, ranges, 1); |
|
|
|
cvNamedWindow("image", 0); |
|
cvNamedWindow("histogram", 0); |
|
|
|
cvCreateTrackbar("brightness", "image", _brightness, 200, @update_brightness); |
|
cvCreateTrackbar("contrast", "image", _contrast, 200, @update_contrast); |
|
|
|
update_brightcont(); |
|
cvWaitKey(0);
|
|
|