一 学习内容
1 获取图像坐标处的像素值,并修改图对比度
二 代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src2, dst;
src2 = imread("e:/2 opencv_projects_zl/desk4.jpg");
if (!src2.data) {
cout << "Load Image Desk2 Error...\n" << endl;
return -1;
}
char Figure_name[] = "Figure1";
namedWindow(Figure_name, CV_WINDOW_AUTOSIZE);
imshow(Figure_name, src2);
// 学习新内容
//1. 调整图像亮度和对比度
int height = src2.rows;
int width = src2.cols;
double alpha = 1.2;
double beta = 10;
dst = Mat::zeros(src2.size(),src2.type());
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++)
{
if (src2.channels() == 3) {
float b = src2.at<Vec3b>(row,col)[0];
float g = src2.at<Vec3b>(row, col)[1];
float r = src2.at<Vec3b>(row, col)[2];
// 修改像素值
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src2.channels() == 1) {
float value = src2.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(value*alpha + beta);
}
}
}
char Figure_name2[] = "Figure2";
namedWindow(Figure_name2, CV_WINDOW_AUTOSIZE);
imshow(Figure_name2, dst);
//2. 将原图像转化为Vec3f型,并从中读取数据
Mat dst2;
src2.convertTo(dst2,CV_32F);
height = src2.rows;
width = src2.cols;
alpha = 1.2;
beta = 10;
dst = Mat::zeros(src2.size(), src2.type());
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++)
{
if (src2.channels() == 3) {
float b = dst2.at<Vec3f>(row, col)[0];
float g = dst2.at<Vec3f>(row, col)[1];
float r = dst2.at<Vec3f>(row, col)[2];
// 修改像素值
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src2.channels() == 1) {
float value = dst2.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(value*alpha + beta);
}
}
}
char Figure_name3[] = "Figur3";
namedWindow(Figure_name3, CV_WINDOW_AUTOSIZE);
imshow(Figure_name3, dst);
//3. 将原图像直接转化为灰度图像,再执行一遍
cvtColor(src2,src2,CV_BGR2GRAY);
height = src2.rows;
width = src2.cols;
alpha = 1.2;
beta = 10;
dst = Mat::zeros(src2.size(), src2.type());
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++)
{
if (src2.channels() == 3) {
float b = src2.at<Vec3b>(row, col)[0];
float g = src2.at<Vec3b>(row, col)[1];
float r = src2.at<Vec3b>(row, col)[2];
// 修改像素值
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src2.channels() == 1) {
float value = src2.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(value*alpha + beta);
}
}
}
char Figure_name4[] = "Figure4";
namedWindow(Figure_name4, CV_WINDOW_AUTOSIZE);
imshow(Figure_name4, dst);
waitKey(0);
return 0;
}
三、调试结果