美文网首页
at()函数改变图像的对比度和亮度(openCV)(4)

at()函数改变图像的对比度和亮度(openCV)(4)

作者: 傻傻小萝卜 | 来源:发表于2017-05-02 18:15 被阅读68次

    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;

    }

    如果要遍历图像,并不推荐使用at()函数。使用这个函数的优点是代码的可读性高,但是效率并不是很高,可以使用迭代器。

    相关文章

      网友评论

          本文标题:at()函数改变图像的对比度和亮度(openCV)(4)

          本文链接:https://www.haomeiwen.com/subject/qmfhtxtx.html