at()函数
函数at()来实现读去矩阵中的某个像素,或者对某个像素进行赋值操作。下面两行代码演示了at()函数的使用方法。
uchar value = grayim.at(i,j);//读出第i行第j列像素值
grayim.at(i,j)=128; //将第i行第j列像素值设置为128
如果要对图像进行遍历,可以参考下面的例程。这个例程创建了两个图像,
分别是单通道的grayim以及3个通道的colorim,然后对两个图像的所有像素值
进行赋值,最后现实结果。
for( int i = 0; i < colorim.rows; ++i)
for( int j = 0; j < colorim.cols; ++j )
{
Vec3b pixel;
pixel[0] = i%255; //Blue
pixel[1] = j%255; //Green
pixel[2] = 0; //Red
colorim.at(i,j) = pixel;
}
}
改变图像亮度和透明度的基本实现方法:
实现效果的核心代码
for( int i = 0; i < imageDpi.rows; i++) {
for( int j = 0; j < imageDpi.cols; j++) {
for( int k = 0; k < 3; k++) {
new_image.at(i, j)[k] = saturate_cast(alpha * ( imageDpi.at(i, j)[k]) + betal);
}
}
}
为了访问图像的每一个像素,使用语法: image.at(i, j)[k] ,其中, i 是像素所在的行, j 是像素所在的列, k 是R、G、B(0、1、2)之一。
用 saturate_cast 对结果进行转换,以确保它为有效值。
实现效果
实现代码
// 需要的公共属性
using namespace cv;
Mat imageDpi;
Mat new_image;
@interface ViewController ()
{
UIImageView *imagView2;
float alpha;
float betal;
}
初始化界面和Mat对象等
UIImageView *imagView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, self.view.bounds.size.width, 200)];
[self.view addSubview:imagView1];
imagView2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 350, self.view.bounds.size.width, 200)];
[self.view addSubview:imagView2];
UIImage *image = [UIImage imageNamed:@"try.png"];
imagView1.image = image;
// 将图片转换为Mat对象
UIImage *image3 = [UIImage imageNamed:@"try.png"];
// Mat imageDpi;
UIImageToMat(image3, imageDpi);
// 初始化接收后最后修改结果的对象
new_image = Mat::zeros(imageDpi.size(), imageDpi.type());
imagView2.image = image;
UISlider *slider1 = [[UISlider alloc] initWithFrame:CGRectMake(0,600, self.view.bounds.size.width, 20)];
slider1.value = 0;
slider1.tag = 1000;
slider1.maximumValue = 3;
[slider1 addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];// 针对值变化添加响应方法
[self.view addSubview:slider1];
UISlider *slider2 = [[UISlider alloc] initWithFrame:CGRectMake(0,630, self.view.bounds.size.width, 20)];
slider2.value = 0;
slider2.tag = 2000;
slider2.maximumValue = 100;
[slider2 addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];// 针对值变化添加响应方法
[self.view addSubview:slider2];
实现方法
- (void)sliderValueChanged:(UISlider *)sender{
NSLog(@"%f",sender.value);
if (sender.tag == 1000) {
alpha = sender.value;
}else{
betal = sender.value;;
}
for( int i = 0; i < imageDpi.rows; i++) {
for( int j = 0; j < imageDpi.cols; j++) {
for( int k = 0; k < 3; k++) {
new_image.at(i, j)[k] = saturate_cast(alpha * ( imageDpi.at(i, j)[k]) + betal);
}
}
}
// 最后需要将 Mat 转换为 UIImage 对象
UIImage *image = MatToUIImage(new_image);
imagView2.image = image;
}