Merge branch 'master' of git://github.com/Opencv/opencv into UserColormap
This commit is contained in:
@@ -8,51 +8,60 @@
|
||||
#include "opencv2/highgui.hpp"
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
double alpha; /**< Simple contrast control */
|
||||
int beta; /**< Simple brightness control */
|
||||
|
||||
/**
|
||||
* @function main
|
||||
* @brief Main function
|
||||
*/
|
||||
int main( int, char** argv )
|
||||
{
|
||||
/// Read image given by user
|
||||
Mat image = imread( argv[1] );
|
||||
Mat new_image = Mat::zeros( image.size(), image.type() );
|
||||
//! [basic-linear-transform-parameters]
|
||||
double alpha = 1.0; /*< Simple contrast control */
|
||||
int beta = 0; /*< Simple brightness control */
|
||||
//! [basic-linear-transform-parameters]
|
||||
|
||||
/// Initialize values
|
||||
std::cout<<" Basic Linear Transforms "<<std::endl;
|
||||
std::cout<<"-------------------------"<<std::endl;
|
||||
std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
|
||||
std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
|
||||
/// Read image given by user
|
||||
//! [basic-linear-transform-load]
|
||||
Mat image = imread( argv[1] );
|
||||
//! [basic-linear-transform-load]
|
||||
//! [basic-linear-transform-output]
|
||||
Mat new_image = Mat::zeros( image.size(), image.type() );
|
||||
//! [basic-linear-transform-output]
|
||||
|
||||
/// Initialize values
|
||||
cout << " Basic Linear Transforms " << endl;
|
||||
cout << "-------------------------" << endl;
|
||||
cout << "* Enter the alpha value [1.0-3.0]: "; cin >> alpha;
|
||||
cout << "* Enter the beta value [0-100]: "; cin >> beta;
|
||||
|
||||
/// Do the operation new_image(i,j) = alpha*image(i,j) + beta
|
||||
/// Instead of these 'for' loops we could have used simply:
|
||||
/// image.convertTo(new_image, -1, alpha, beta);
|
||||
/// but we wanted to show you how to access the pixels :)
|
||||
for( int y = 0; y < image.rows; y++ )
|
||||
{ for( int x = 0; x < image.cols; x++ )
|
||||
{ for( int c = 0; c < 3; c++ )
|
||||
{
|
||||
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
||||
}
|
||||
}
|
||||
}
|
||||
/// Do the operation new_image(i,j) = alpha*image(i,j) + beta
|
||||
/// Instead of these 'for' loops we could have used simply:
|
||||
/// image.convertTo(new_image, -1, alpha, beta);
|
||||
/// but we wanted to show you how to access the pixels :)
|
||||
//! [basic-linear-transform-operation]
|
||||
for( int y = 0; y < image.rows; y++ ) {
|
||||
for( int x = 0; x < image.cols; x++ ) {
|
||||
for( int c = 0; c < 3; c++ ) {
|
||||
new_image.at<Vec3b>(y,x)[c] =
|
||||
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [basic-linear-transform-operation]
|
||||
|
||||
/// Create Windows
|
||||
namedWindow("Original Image", 1);
|
||||
namedWindow("New Image", 1);
|
||||
//! [basic-linear-transform-display]
|
||||
/// Create Windows
|
||||
namedWindow("Original Image", WINDOW_AUTOSIZE);
|
||||
namedWindow("New Image", WINDOW_AUTOSIZE);
|
||||
|
||||
/// Show stuff
|
||||
imshow("Original Image", image);
|
||||
imshow("New Image", new_image);
|
||||
/// Show stuff
|
||||
imshow("Original Image", image);
|
||||
imshow("New Image", new_image);
|
||||
|
||||
|
||||
/// Wait until user press some key
|
||||
waitKey();
|
||||
return 0;
|
||||
/// Wait until user press some key
|
||||
waitKey();
|
||||
//! [basic-linear-transform-display]
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ int main(){
|
||||
0, 255, 0, 255, 0, 0, 255, 0,
|
||||
0, 255, 255, 255, 0, 0, 0, 0);
|
||||
|
||||
Mat kernel = (Mat_<uchar>(3, 3) <<
|
||||
Mat kernel = (Mat_<int>(3, 3) <<
|
||||
0, 1, 0,
|
||||
1, -1, 1,
|
||||
0, 1, 0);
|
||||
@@ -23,10 +23,15 @@ int main(){
|
||||
Mat output_image;
|
||||
morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);
|
||||
|
||||
namedWindow("Original", CV_WINDOW_NORMAL);
|
||||
const int rate = 10;
|
||||
kernel = (kernel + 1) * 127;
|
||||
kernel.convertTo(kernel, CV_8U);
|
||||
cv::resize(kernel, kernel, cv::Size(), rate, rate, INTER_NEAREST);
|
||||
imshow("kernel", kernel);
|
||||
cv::resize(input_image, input_image, cv::Size(), rate, rate, INTER_NEAREST);
|
||||
imshow("Original", input_image);
|
||||
namedWindow("Hit or Miss", CV_WINDOW_NORMAL);
|
||||
cv::resize(output_image, output_image, cv::Size(), rate, rate, INTER_NEAREST);
|
||||
imshow("Hit or Miss", output_image);
|
||||
waitKey(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
#include <iostream>
|
||||
#include "opencv2/imgcodecs.hpp"
|
||||
#include "opencv2/highgui.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
namespace
|
||||
{
|
||||
/** Global Variables */
|
||||
int alpha = 100;
|
||||
int beta = 100;
|
||||
int gamma_cor = 100;
|
||||
Mat img_original, img_corrected, img_gamma_corrected;
|
||||
|
||||
void basicLinearTransform(const Mat &img, const double alpha_, const int beta_)
|
||||
{
|
||||
Mat res;
|
||||
img.convertTo(res, -1, alpha_, beta_);
|
||||
|
||||
hconcat(img, res, img_corrected);
|
||||
}
|
||||
|
||||
void gammaCorrection(const Mat &img, const double gamma_)
|
||||
{
|
||||
CV_Assert(gamma_ >= 0);
|
||||
//![changing-contrast-brightness-gamma-correction]
|
||||
Mat lookUpTable(1, 256, CV_8U);
|
||||
uchar* p = lookUpTable.ptr();
|
||||
for( int i = 0; i < 256; ++i)
|
||||
p[i] = saturate_cast<uchar>(pow(i / 255.0, gamma_) * 255.0);
|
||||
|
||||
Mat res = img.clone();
|
||||
LUT(img, lookUpTable, res);
|
||||
//![changing-contrast-brightness-gamma-correction]
|
||||
|
||||
hconcat(img, res, img_gamma_corrected);
|
||||
}
|
||||
|
||||
void on_linear_transform_alpha_trackbar(int, void *)
|
||||
{
|
||||
double alpha_value = alpha / 100.0;
|
||||
int beta_value = beta - 100;
|
||||
basicLinearTransform(img_original, alpha_value, beta_value);
|
||||
}
|
||||
|
||||
void on_linear_transform_beta_trackbar(int, void *)
|
||||
{
|
||||
double alpha_value = alpha / 100.0;
|
||||
int beta_value = beta - 100;
|
||||
basicLinearTransform(img_original, alpha_value, beta_value);
|
||||
}
|
||||
|
||||
void on_gamma_correction_trackbar(int, void *)
|
||||
{
|
||||
double gamma_value = gamma_cor / 100.0;
|
||||
gammaCorrection(img_original, gamma_value);
|
||||
}
|
||||
}
|
||||
|
||||
int main( int, char** argv )
|
||||
{
|
||||
img_original = imread( argv[1] );
|
||||
img_corrected = Mat(img_original.rows, img_original.cols*2, img_original.type());
|
||||
img_gamma_corrected = Mat(img_original.rows, img_original.cols*2, img_original.type());
|
||||
|
||||
hconcat(img_original, img_original, img_corrected);
|
||||
hconcat(img_original, img_original, img_gamma_corrected);
|
||||
|
||||
namedWindow("Brightness and contrast adjustments", WINDOW_AUTOSIZE);
|
||||
namedWindow("Gamma correction", WINDOW_AUTOSIZE);
|
||||
|
||||
createTrackbar("Alpha gain (contrast)", "Brightness and contrast adjustments", &alpha, 500, on_linear_transform_alpha_trackbar);
|
||||
createTrackbar("Beta bias (brightness)", "Brightness and contrast adjustments", &beta, 200, on_linear_transform_beta_trackbar);
|
||||
createTrackbar("Gamma correction", "Gamma correction", &gamma_cor, 200, on_gamma_correction_trackbar);
|
||||
|
||||
while (true)
|
||||
{
|
||||
imshow("Brightness and contrast adjustments", img_corrected);
|
||||
imshow("Gamma correction", img_gamma_corrected);
|
||||
|
||||
int c = waitKey(30);
|
||||
if (c == 27)
|
||||
break;
|
||||
}
|
||||
|
||||
imwrite("linear_transform_correction.png", img_corrected);
|
||||
imwrite("gamma_correction.png", img_gamma_corrected);
|
||||
|
||||
return 0;
|
||||
}
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
#include <iostream>
|
||||
#include <opencv2/core.hpp>
|
||||
#include <opencv2/imgcodecs.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
namespace
|
||||
{
|
||||
//! [mandelbrot-escape-time-algorithm]
|
||||
int mandelbrot(const complex<float> &z0, const int max)
|
||||
{
|
||||
complex<float> z = z0;
|
||||
for (int t = 0; t < max; t++)
|
||||
{
|
||||
if (z.real()*z.real() + z.imag()*z.imag() > 4.0f) return t;
|
||||
z = z*z + z0;
|
||||
}
|
||||
|
||||
return max;
|
||||
}
|
||||
//! [mandelbrot-escape-time-algorithm]
|
||||
|
||||
//! [mandelbrot-grayscale-value]
|
||||
int mandelbrotFormula(const complex<float> &z0, const int maxIter=500) {
|
||||
int value = mandelbrot(z0, maxIter);
|
||||
if(maxIter - value == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return cvRound(sqrt(value / (float) maxIter) * 255);
|
||||
}
|
||||
//! [mandelbrot-grayscale-value]
|
||||
|
||||
//! [mandelbrot-parallel]
|
||||
class ParallelMandelbrot : public ParallelLoopBody
|
||||
{
|
||||
public:
|
||||
ParallelMandelbrot (Mat &img, const float x1, const float y1, const float scaleX, const float scaleY)
|
||||
: m_img(img), m_x1(x1), m_y1(y1), m_scaleX(scaleX), m_scaleY(scaleY)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void operator ()(const Range& range) const
|
||||
{
|
||||
for (int r = range.start; r < range.end; r++)
|
||||
{
|
||||
int i = r / m_img.cols;
|
||||
int j = r % m_img.cols;
|
||||
|
||||
float x0 = j / m_scaleX + m_x1;
|
||||
float y0 = i / m_scaleY + m_y1;
|
||||
|
||||
complex<float> z0(x0, y0);
|
||||
uchar value = (uchar) mandelbrotFormula(z0);
|
||||
m_img.ptr<uchar>(i)[j] = value;
|
||||
}
|
||||
}
|
||||
|
||||
ParallelMandelbrot& operator=(const ParallelMandelbrot &) {
|
||||
return *this;
|
||||
};
|
||||
|
||||
private:
|
||||
Mat &m_img;
|
||||
float m_x1;
|
||||
float m_y1;
|
||||
float m_scaleX;
|
||||
float m_scaleY;
|
||||
};
|
||||
//! [mandelbrot-parallel]
|
||||
|
||||
//! [mandelbrot-sequential]
|
||||
void sequentialMandelbrot(Mat &img, const float x1, const float y1, const float scaleX, const float scaleY)
|
||||
{
|
||||
for (int i = 0; i < img.rows; i++)
|
||||
{
|
||||
for (int j = 0; j < img.cols; j++)
|
||||
{
|
||||
float x0 = j / scaleX + x1;
|
||||
float y0 = i / scaleY + y1;
|
||||
|
||||
complex<float> z0(x0, y0);
|
||||
uchar value = (uchar) mandelbrotFormula(z0);
|
||||
img.ptr<uchar>(i)[j] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [mandelbrot-sequential]
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
//! [mandelbrot-transformation]
|
||||
Mat mandelbrotImg(4800, 5400, CV_8U);
|
||||
float x1 = -2.1f, x2 = 0.6f;
|
||||
float y1 = -1.2f, y2 = 1.2f;
|
||||
float scaleX = mandelbrotImg.cols / (x2 - x1);
|
||||
float scaleY = mandelbrotImg.rows / (y2 - y1);
|
||||
//! [mandelbrot-transformation]
|
||||
|
||||
double t1 = (double) getTickCount();
|
||||
//! [mandelbrot-parallel-call]
|
||||
ParallelMandelbrot parallelMandelbrot(mandelbrotImg, x1, y1, scaleX, scaleY);
|
||||
parallel_for_(Range(0, mandelbrotImg.rows*mandelbrotImg.cols), parallelMandelbrot);
|
||||
//! [mandelbrot-parallel-call]
|
||||
t1 = ((double) getTickCount() - t1) / getTickFrequency();
|
||||
cout << "Parallel Mandelbrot: " << t1 << " s" << endl;
|
||||
|
||||
Mat mandelbrotImgSequential(4800, 5400, CV_8U);
|
||||
double t2 = (double) getTickCount();
|
||||
sequentialMandelbrot(mandelbrotImgSequential, x1, y1, scaleX, scaleY);
|
||||
t2 = ((double) getTickCount() - t2) / getTickFrequency();
|
||||
cout << "Sequential Mandelbrot: " << t2 << " s" << endl;
|
||||
cout << "Speed-up: " << t2/t1 << " X" << endl;
|
||||
|
||||
imwrite("Mandelbrot_parallel.png", mandelbrotImg);
|
||||
imwrite("Mandelbrot_sequential.png", mandelbrotImgSequential);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Reference in New Issue
Block a user