常用的像素操作算法:图像加法、像素混合、提取图像中的ROI

简介: 常用的像素操作算法:图像加法、像素混合、提取图像中的ROI

图像可以是看成是一个多维的数组。读取一张图片,可以看成是读入了一系列的像素内容。这些像素内容,按照不同的模式具有不同的格式。对于三通道的 RGB 位图来说,每个像素是一个 8-bit 整数的三元组。图像的像素操作是比较基础的图像算法,下面列举三个常用的像素操作算法。


图像加法



图像的加法表示两个输入图像在同一位置上的像素相加,得到一个输出图像的过程。

imageProcessor = Operator.add(imageProcessor1,imageProcessor2);
        if (imageProcessor!=null) {
            CV4JImage resultCV4JImage = new CV4JImage(imageProcessor.getWidth(), imageProcessor.getHeight(), imageProcessor.getPixels());
            result.setImageBitmap(resultCV4JImage.getProcessor().getImage().toBitmap());
        }


image.png

图像加法.png


Operator的add表示矩阵加法,有一个要求两个图像必须大小一致。

public static ImageProcessor add(ImageProcessor image1, ImageProcessor image2) {
        if(!checkParams(image1, image2)) {
            return null;
        }
        int channels = image1.getChannels();
        int w = image1.getWidth();
        int h = image1.getHeight();
        ImageProcessor dst = (channels == 3) ? new ColorProcessor(w, h) : new ByteProcessor(w, h);
        int size = w*h;
        int a=0, b=0;
        int c=0;
        for(int i=0; i<size; i++) {
            for(int n=0; n<channels; n++) {
                a = image1.toByte(n)[i]&0xff;
                b = image2.toByte(n)[i]&0xff;
                c = Tools.clamp(a + b);
                dst.toByte(n)[i] = (byte)c;
            }
        }
        return dst;
    }


在实际工作中,可以通过一张原图和一个mask图像来相加合成一些不规则的效果图片。


像素混合



在这里混合是线性混合,跟之前的图像加法有一定的区别。

imageProcessor = Operator.addWeight(imageProcessor1,2.0f,imageProcessor2,1.0f,4);
        if (imageProcessor!=null) {
            CV4JImage resultCV4JImage = new CV4JImage(imageProcessor.getWidth(), imageProcessor.getHeight(), imageProcessor.getPixels());
            result.setImageBitmap(resultCV4JImage.getProcessor().getImage().toBitmap());
        }

image.png

像素混合.png


Operator的addWeight方法表示像素混合。


image.png

addWeight.png

public static ImageProcessor addWeight(ImageProcessor image1, float w1, ImageProcessor image2, float w2, int gamma) {
        if(!checkParams(image1, image2)) {
            return null;
        }
        int channels = image1.getChannels();
        int w = image1.getWidth();
        int h = image1.getHeight();
        ImageProcessor dst = (channels == 3) ? new ColorProcessor(w, h) : new ByteProcessor(w, h);
        int size = w*h;
        int a=0, b=0;
        int c=0;
        for(int i=0; i<size; i++) {
            for(int n=0; n<channels; n++) {
                a = image1.toByte(n)[i]&0xff;
                b = image2.toByte(n)[i]&0xff;
                c = (int)(a*w1 + b*w2 + gamma);
                dst.toByte(n)[i] = (byte)Tools.clamp(c);
            }
        }
        return dst;
    }


提取图像中的ROI



ROI(region of interest),表示图像中感兴趣的区域。对于一张图像,可能我们只对图像中某部分感兴趣,或者要对目标进行跟踪时,需要选取目标特征,所以要提取图像的感兴趣区域。

Resources res = getResources();
        final Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.pixel_test_3);
        image.setImageBitmap(bitmap);
        CV4JImage cv4jImage = new CV4JImage(bitmap);
        ImageProcessor imageProcessor = cv4jImage.getProcessor();
        Rect rect = new Rect();
        rect.x = 300;
        rect.y = 200;
        rect.width = 300;
        rect.height = 450;
        ImageProcessor resultImageProcessor = null;
        try {
            resultImageProcessor = Operator.subImage(imageProcessor,rect);
        } catch (CV4JException e) {
        }
        if (resultImageProcessor!=null) {
            CV4JImage resultCV4JImage = new CV4JImage(resultImageProcessor.getWidth(), resultImageProcessor.getHeight(), resultImageProcessor.getPixels());
            result.setImageBitmap(resultCV4JImage.getProcessor().getImage().toBitmap());
        }


image.png

提取图像中的ROI.png


其中,rect.x和rect.y表示ROI的起始点,rect.width和rect.height表示ROI的宽和高。Operator的subImage()表示从原图中提取ROI,之所以在这里还用到了try catch,是为了防止出现ROI的宽度或者高度过大,从而导致数组越界。


subImage方法的代码也很简单

/**
     * ROI sub image by rect.x, rect.y, rect.width, rect.height
     * @param image
     * @param rect
     * @return
     * @throws CV4JException
     */
    public static ImageProcessor subImage(ImageProcessor image, Rect rect) throws CV4JException{
        int channels = image.getChannels();
        int w = rect.width;
        int h = rect.height;
        ImageProcessor dst = (channels == 3) ? new ColorProcessor(w, h) : new ByteProcessor(w, h);
        int a=0;
        int index = 0;
        try {
            for(int n=0; n<channels; n++) {
                for(int row=rect.y; row < (rect.y+rect.height); row++) {
                    for(int col=rect.x; col < (rect.x+rect.width); col++) {
                        index = row*image.getWidth() + col;
                        a = image.toByte(n)[index]&0xff;
                        index = (row - rect.y)*w + (col - rect.x);
                        dst.toByte(n)[index] = (byte)a;
                    }
                }
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            throw new CV4JException("数组越界了");
        }
        return dst;
    }


总结



cv4jgloomyfish和我一起开发的图像处理库,纯java实现,目前还处于早期的版本。

像素操作是 cv4j 的基本功能之一,所有的像素操作算法都在Operator类中。除了本文介绍的三个算法之外,还有substract表示矩阵减法、multiple表示矩阵逐元素乘法、division表示矩阵逐元素除法以及bitwise_and、bitwise_not、bitwise_or、bitwise_xor表示每个元素进行位运算分别是和、非、或、异或。

相关文章
|
30天前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
29天前
|
机器学习/深度学习 人工智能 算法
【MM2024】面向 StableDiffusion 的多目标图像编辑算法 VICTORIA
阿里云人工智能平台 PAI 团队与华南理工大学合作在国际多媒体顶级会议 ACM MM2024 上发表 VICTORIA 算法,这是一种面向 StableDiffusion 的多目标图像编辑算法。VICTORIA 通过文本依存关系来修正图像编辑过程中的交叉注意力图,从而确保关系对象的一致性,支持用户通过修改描述性提示一次性编辑多个目标。
|
5月前
|
算法 计算机视觉
图像处理之积分图应用四(基于局部均值的图像二值化算法)
图像处理之积分图应用四(基于局部均值的图像二值化算法)
530 0
|
1月前
|
算法 数据安全/隐私保护
织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE
本项目展示了织物瑕疵检测中的图像拼接技术,使用SIFT、SURF和KAZE三种算法。通过MATLAB2022a实现图像匹配、配准和拼接,最终检测并分类织物瑕疵。SIFT算法在不同尺度和旋转下保持不变性;SURF算法提高速度并保持鲁棒性;KAZE算法使用非线性扩散滤波器构建尺度空间,提供更先进的特征描述。展示视频无水印,代码含注释及操作步骤。
|
2月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
4月前
|
机器学习/深度学习 编解码 监控
算法金 | 深度学习图像增强方法总结
**图像增强技术概括** 图像增强聚焦于提升视觉效果和细节,广泛应用于医学、遥感等领域。空间域增强包括直方图均衡化(增强对比度)、对比度拉伸、灰度变换、平滑滤波(均值、中值)和锐化滤波(拉普拉斯、高通)。频率域增强利用傅里叶变换、小波变换,通过高频和低频滤波增强图像特征。现代方法涉及超分辨率重建、深度学习去噪(如CNN、Autoencoder)、图像修复(如GAN)和GANs驱动的多种图像处理任务。
136 14
算法金 | 深度学习图像增强方法总结
|
3月前
|
算法 前端开发 计算机视觉
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
40 0
|
3月前
|
自然语言处理 并行计算 算法
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
44 0
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
|
4月前
|
算法
基于粒子群优化的图像融合算法matlab仿真
这是一个基于粒子群优化(PSO)的图像融合算法,旨在将彩色模糊图像与清晰灰度图像融合成彩色清晰图像。在MATLAB2022a中测试,算法通过PSO求解最优融合权值参数,经过多次迭代更新粒子速度和位置,以优化融合效果。核心代码展示了PSO的迭代过程及融合策略。最终,使用加权平均法融合图像,其中权重由PSO计算得出。该算法体现了PSO在图像融合领域的高效性和融合质量。