table of Contents
Acquiring an image pixel pointer
Range pixel processing saturate_cast
Masking operation to achieve image contrast adjustment
Function calls filter2D function
Acquiring an image pixel pointer
CV_Assert(myImage.depth() == CV_8U);
Mat.ptr <uchar> (int i = 0) of the pixel matrix acquired pointers, index i denotes the first few lines, the line count from zero.
Obtaining a current row pointer const uchar * current = myImage.ptr <uchar> (row);
Get the current pixel P (row, col) of the pixel value p (row, col) = current [col]
Processing pixel range saturate_cast <uchar>
saturate_cast <uchar> (- 100), returns 0.
saturate_cast <uchar> (288), or 255
saturate_cast <uchar> (100), returned 100
Of this function is to ensure that the RGB worth range between 0 to 255
Masking operation to achieve image contrast adjustment
Red is the center pixel, from top to bottom, left to right to do the same for each pixel processing operation, the final result is an output image after the object contrast improvement Mat
Function calls filter2D function
Defined mask:
Mat kernel = (Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D( src, dst, src.depth(), kernel );
Wherein src and dst are Mat type variable,
src.depth bitmaps representing depth, there 32,24,8 like.
Exercise program
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/vcprojects/images/test.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
/*
int cols = (src.cols-1) * src.channels();
int offsetx = src.channels();
int rows = src.rows;
dst = Mat::zeros(src.size(), src.type());
for (int row = 1; row < (rows - 1); row++) {
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++) {
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col- offsetx] + current[col+ offsetx] + previous[col] + next[col]));
}
}
*/
double t = getTickCount();
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
double timeconsume = (getTickCount() - t) / getTickFrequency();
printf("tim consume %.2f\n", timeconsume);
namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}