我有一张图片。我想修改图像,使每个像素的值增加一个特定的边距。接下来我想保存新创建的图像并显示它。
我尝试更改每个像素值,但只能将其设置为常量值。我不希望所有像素都是常数,但它们的值应增加(假设)50。
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat image;
image = imread("/home/rohit_136/Desktop/image.jpg",CV_LOAD_IMAGE_UNCHANGED);
for (int i = 0; i < image.cols; i++) {
for (int j = 0; j < image.rows; j++) {
Vec3b intensity = image.at<Vec3b>(j, i)=50
}
}
return 0;
}
答案 0 :(得分:0)
Vec3b
是一个包含3个字节(字符)的向量。每个字节表示单个BGR(蓝色,绿色,红色)或RGB通道的值。您应该遍历此向量并单独修改每个通道。要小心,因为我们讨论的是字节,每个字节应该取0到255之间的值。我建议设置一个避免溢出的阈值。
注意:如果您不关心alpha通道,我建议您使用CV_LOAD_IMAGE_COLOR加载图片。这将确保您的图像以BGR格式加载。
答案 1 :(得分:0)
cv::Mat Image =cv::imread("image.jpg");
uint8_t * orig_ptr = (uint8_t*)Image.data;
for (int y = 0; y < Image.rows; y++)
{
for (int x = 0; x < Image.cols; x++)
{
/*Reading Pizel Values*/
int R = orig_ptr[x * 3 + y*Image.step + 2];/*R -Pixel*/
int G = orig_ptr[x * 3 + y*Image.step + 1];/*G-Pixel*/
int B = orig_ptr[x * 3 + y*Image.step]; /*B-Pixel*/
/*Updating Values*/
orig_ptr[x * 3 + y*Image.step + 2] = cv::saturate_cast<uint8_t>(R + 50);
orig_ptr[x * 3 + y*Image.step + 1] =cv::saturate_cast<uint8_t>(G + 50);
orig_ptr[x * 3 + y*Image.step]=cv::saturate_cast<uint8_t>(B + 50);
}
}