ImageEditContrast
法一:
C++ 调整黑点、白点和中值以增加、平衡或降低对比度
static_cast<unsigned char> (zeno::max(0, zeno::min(255, (255 * (median - black)) / (white - black)))
调整黑点
要调整黑点,您需要将图像中的所有像素的值都减去一个常数。这将导致较暗的像素变得更暗,因为它们现在更接近黑色。
下面是一个示例代码片段,演示如何使用C++来调整黑点:
void adjustBlackPoint(unsigned char* imageData, int width, int height, int threshold) {
for(int i = 0; i < width * height; i++) {
if(imageData[i] < threshold) {
imageData[i] = 0;
} else {
imageData[i] -= threshold;
}
}
}
在上面的代码中,imageData
是图像数据的指针,width
和height
是图像的宽度和高度,threshold
是一个常数,用于控制黑点的调整。这里,如果像素值小于threshold
,则像素将被设置为0,否则将从像素值中减去threshold
。
调整白点
要调整白点,您需要将图像中的所有像素的值都加上一个常数。这将导致较亮的像素变得更亮,因为它们现在更接近白色。
下面是一个示例代码片段,演示如何使用C++来调整白点:
void adjustWhitePoint(unsigned char* imageData, int width, int height, int threshold) {
for(int i = 0; i < width * height; i++) {
if(imageData[i] > threshold) {
imageData[i] = 255;
} else {
imageData[i] += threshold;
}
}
}
在上面的代码中,imageData
是图像数据的指针,width
和height
是图像的宽度和高度,threshold
是一个常数,用于控制白点的调整。这里,如果像素值大于threshold
,则像素将被设置为255,否则将从像素值中加上threshold
。
调整中值
要调整中值,您需要计算图像的中值,并将所有像素的值移动到中值周围。这将导致图像的对比度增加,并使亮度更加均衡。
下面是一个示例代码片段,演示如何使用C++来调整中值:
void adjustMidValue(unsigned char* imageData, int width, int height) {
int medianIndex = (width * height) / 2;
std::nth_element(imageData, imageData + medianIndex, imageData + width * height);
int medianValue = imageData[medianIndex];
for(int i = 0; i < width * height; i++) {
imageData[i] += (128 - medianValue);
}
法二:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 读取图像数据并将其存储为二维数组
vector<vector<int>> readImage(string filename, int width, int height) {
// 读取图像数据
// ...
// 将图像数据存储为二维数组
vector<vector<int>> image(height, vector<int>(width));
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
image[i][j] = imageData[i * width + j];
}
}
return image;
}
// 调整黑点、白点和中值以增加、平衡或降低对比度
vector<vector<int>> adjustContrast(vector<vector<int>> image, int blackPoint, int whitePoint, int median) {
int height = image.size();
int width = image[0].size();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
// 增加、平衡或降低对比度
int pixel = image[i][j];
pixel -= blackPoint;
pixel += whitePoint;
pixel += median / 2;
// 如果调整后的像素值小于0,则将其设置为0
if (pixel < 0) {
pixel = 0;
}
// 如果调整后的像素值大于255,则将其设置为255
if (pixel > 255) {
pixel = 255;
}
image[i][j] = pixel;
}
}
return image;
}
int main() {
// 读取图像数据
vector<vector<int>> image = readImage("image.bmp", 640, 480);
// 增加、平衡或降低对比度
int blackPoint = 10;
int whitePoint = -10;
int median = 128;
image = adjustContrast(image, blackPoint, whitePoint, median);
// 保存图像数据
// ...
return 0;
}
法三:
#include <iostream>
#include <vector>
#include <algorithm>
// 像素值映射函数
int map(int value, int black, int white) {
return std::max(0, std::min(255, (255 * (value - black)) / (white - black)));
}
// 调整黑点和白点以增加或平衡对比度
void adjust_contrast(std::vector<unsigned char>& pixels, int width, int height, int black, int white) {
for (int i = 0; i < width * height; i++) {
pixels[i] = static_cast<unsigned char>(map(pixels[i], black, white));
}
}
// 使用中值滤波器平滑图像以降低对比度
void reduce_contrast(std::vector<unsigned char>& pixels, int width, int height, int kernel_size) {
std::vector<unsigned char> temp(pixels.size());
int half_kernel_size = kernel_size / 2;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
std::vector<unsigned char> values;
for (int ky = -half_kernel_size; ky <= half_kernel_size; ky++) {
for (int kx = -half_kernel_size; kx <= half_kernel_size; kx++) {
int nx = std::max(0, std::min(width - 1, x + kx));
int ny = std::max(0, std::min(height - 1, y + ky));
values.push_back(pixels[ny * width + nx]);
}
}
std::sort(values.begin(), values.end());
temp[y * width + x] = values[values.size() / 2];
}
}
pixels = temp;
}
int main() {
// 读取图像并将其转换为灰度图像
int width = 640;
int height = 480;
std::vector<unsigned char> pixels(width * height);
// 假设你已经从文件中加载了像素数据到 pixels 容器中
// 计算图像的最小值和最大值
int min_value = 255;
int max_value = 0;
for (int i = 0; i < width * height; i++) {
min_value = std::min(min_value, static_cast<int>(pixels[i]));
max_value = std::max(max_value, static_cast<int>(pixels[i]));
}
// 调整黑点和白点以增
文章评论