精华内容
下载资源
问答
  • OpenCV入门之图像灰度处理 ** 利用python3和OpenCV对图像进行灰度处理,关于图像处理的本质就是对数组的操作,彩色图像是一个三维数组,有长、宽和深度三个参数,灰度图像是一个二维数组,只有长和宽两个参数。 ...

    **

    OpenCV入门之图像灰度处理

    **
    利用python3和OpenCV对图像进行灰度处理,关于图像处理的本质就是对数组的操作,彩色图像是一个三维数组,有长、宽和深度三个参数,灰度图像是一个二维数组,只有长和宽两个参数。
    原图如下:
    在这里插入图片描述
    方法一:imread方法
    利用OpenCV的imread方法以灰度形式读取图片,代码如下:

    # 方法1:通过imread方法直接对图片进行灰度处理
    import cv2
    img = cv2.imread("image0.jpg", 0)
    cv2.imshow("img", img)
    cv2.waitKey(0)
    

    代码中imread方法中两个参数分别是原图片的名称和读取的方式,读取方式为0表示以灰度形式读取,如果改为1则是以彩色形式读取
    方法二:通过cvtcolor方法实现颜色空间转换
    利用OpenCV的cvtcolor方法对图片进行颜色空间转换,cvtsolor可以实现多种空间转换,我们取COLOR_RGB2GRAY转换为灰度,代码如下:

    # 方法2:通过cvtcolor方法实现空间转换
    img0 = cv2.imread("image0.jpg", 1)
    dst = cv2.cvtColor(img0, cv2.COLOR_RGB2GRAY) # 颜色空间转换
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    

    方法三:求平均灰度值,gray = (R+G+B)/3
    获取图片的像素值(b,g,r),利用公式gray=(R+G+B)/3计算平均灰度值,实现图像的灰度转换,具体代码如下:

    import numpy as np
    import cv2
    
    img0 = cv2.imread("image0.jpg", 1)
    dst = cv2.cvtColor(img0, cv2.COLOR_RGB2GRAY) # 颜色空间转换
    cv2.imshow("dst", dst)
    # 方法3:gray = (R+G+B)/3
    height, width, mode = img0.shape
    dst1 = np.zeros((height,width,mode), np.uint8) # 新建一个数组,规格与原图片相同,数值为0-255之间的整数
    for i in range(0, height):
        for j in range(0, width):
            (b, g, r) = img0[i, j]
            gray = (int(b) + int(g) + int(r))/3 # 为了防止uint8格式数据在运算时发生越界,将其定义为int类型
            dst1[i, j] = np.uint8(gray)
    cv2.imshow('dst1', dst1)
    cv2.waitKey(0)
    

    方法四:心理学公式, gray = R*0.299+G*0.587+B*0.114

    对于彩色转灰度,有一个很著名的心理学公式:gray = R0.299+G0.587+B*0.114,我们只需将方法三中的 gray = (int(b) + int(g) + int( r))/3替换成心理学公式gray = int( r)*0.299+int(g)*0.587+int(b)*0.114就行。
    运行结果
    在这里插入图片描述

    展开全文
  • 数字图像灰度处理方法

    千次阅读 2019-05-07 12:58:46
    灰度变换 灰度变换是指根据某种目标条件按一定变换关系逐点改变源图像中每一个像素灰度值的方法。...在曝光度不足或过度的情况下,图像灰度可能会局限在一个很小的范围内。这时在显示器上看到的将...

    灰度变换

    灰度变换是指根据某种目标条件按一定变换关系逐点改变源图像中每一个像素灰度值的方法。目的是为了改善画质,使图像的显示效果更加清晰。 图像的灰度变换处理是图像增强处理技术中的一种非常基础、直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。

    灰度变换的几种函数:

    1. 线性变换

    在曝光度不足或过度的情况下,图像灰度可能会局限在一个很小的范围内。这时在显示器上看到的将是一个模糊不清、没有灰度层次的图像。用一个线性单值函数,对图像内的每一个像素做线性扩展,将有效地改善图像视觉效果。假定源图像f(x, y)的灰度范围为[a, b],希望变换后图像g(x, y)的灰度范围扩展至[c, d],则线性变换可表示为 ,由此可见,对输入图像灰度做线性扩张或压缩,映射函数为一个直线方程,该线性灰度变换函数是一个一维线性函数。如下图

    分段线性变换

    增强图像对比度实际是增强图像中各部分之间的反差,往往通过增加图像中两个灰度值间的动态范围来实现,有时也称其为对比度拉伸。为了突出感兴趣的灰度区间,相对抑制那些不感兴趣的灰度区间,可采用分段线性变换。常用的三段线性变换如又图所示,L表示图像总的灰度级数,其数学表达式如下,

    通过调整折线拐点的位置及控制分段直线的斜率,可对任一灰度区间进行扩展或压缩。

       2.非线性变换

    当某图像的像素集中于中间灰度部分,而其他部分的像素很少时,如果只想仔细地分析图像的某一部分,也就是对图像的那部分增强,我们可以压缩像素少的部分,扩展像素数集中的部分。典型的非线性变换函数有幂函数对数函数指数函数、阈值函数、多值量化函数、窗口函数等。阈值函数、多值量化函数、窗口函数。

    下面为代码:

    此图曝光不足,下面算法是对此图的处理:

    clc
    clear
    % B=imread('DSC3.jpg');
    % B=imread('BG.jpg');
    B=imread('IMG_20190.jpg');
    B=rgb2gray(B);%转化为灰度图像
    % B=rgb2gray(A);%转为灰度
    I=mat2gray(B);%对图像做归一化
    c=double(B);%转为双精度
    % imshow(B);
    % title('原图灰度图');
    %-------------- 线性矫正  -------------%
    J_2=imadjust(B,[0 0.07],[0 1],1);%前输入灰度映射灰度的范围即越小越亮,
                                     %后指输出灰度图像灰度的范围即越小越暗,1为线性处理
    J_3=imadjust(B,[0 0.08],[0 1],1);
    J_4=imadjust(B,[0 0.1],[0 1],1);
    figure;
    subplot(221);
    imshow(B);
    subplot(222);
    imshow(J_2);
    subplot(223);
    imshow(J_3);
    subplot(224);
    imshow(J_4);
    title('线性函数处理');
    imwrite(J_2,'DSC3(0).jpg')
    hold on;
    %--------------g=a+c*lg(f+1)-------------%
    %-------------- 对数矫正  -------------%
    %--------适用于处理曝光不足的图片  ---------%
    %-------------- a对图像的影响  -------------%
    J1_2_a=0.05+log(c+1)/4;% a越小,图像越暗
    J1_3_a=0.1+log(c+1)/4;
    J1_4_a=log(c+1)/4;
    %-------------- c对图像的影响  -------------%
    J1_2_c=log(c+1)/2;   %C越大图像越暗
    J1_3_c=log(c+1)/4;
    J1_4_c=log(c+1)/6;
    figure;
    subplot(241);
    imshow(B);
    subplot(242);
    imshow(J1_2_a);
    subplot(243);
    imshow(J1_3_a);
    subplot(244);
    imshow(J1_4_a);
    subplot(245);
    imshow(J1_2_c);
    subplot(246);
    imshow(J1_3_c);
    subplot(247);
    imshow(J1_4_c);
    hold on;
    title('对数函数处理');%对数变换可以用来扩展图像中的暗像素的值,同时压缩更高灰度级的值。数越小越亮
    imwrite(J1_2_a,'DSC3(1).jpg')
    %--------------    幂函数矫正    -------------%
    J2_2=c.^(0.66)/30;%越小越暗
    J2_3=c.^(0.66)/60;%越小越暗
    J2_4=c.^(0.66)/90;%越小越暗
    figure
    subplot(221);
    imshow(B);
    subplot(222);
    imshow(J2_2);
    subplot(223);
    imshow(J2_3);
    subplot(224);
    imshow(J2_4);
    hold on
    title('幂函数处理');
    imwrite(J2_2,'DSC3(2).jpg')
    %--------------    指数函数矫正    -------------%
    %-----------   适合处理曝光过度的图像    -------------%
    J3_2=exp(1*(c-3.5));%越小越暗
    J3_3=exp(1*(c-4.5));%越小越暗
    J3_4=1*exp(1*(c-4.9));%越小越暗
    figure
    subplot(221);
    imshow(B);
    subplot(222);
    imshow(J3_2);
    subplot(223);
    imshow(J3_3);
    subplot(224);
    imshow(J3_4);
    hold on
    title('指数函数处理');
    imwrite(J3_2,'DSC3(2).jpg')
    % 
    % mean2_B=mean2(B);         %灰度平均值
    % std2_B=std2(B);          %灰度标准差
    % corr2_2=corr2(B,B);        %相关系数
    % whos;

    处理结果:

    展开全文
  • 视频技术处理之javaCV视频图像灰度处理,附代码

    千次阅读 多人点赞 2021-05-24 18:04:54
    图片灰度处理效果 视频灰度处理效果 Java spring boot项目或者maven项目的pom文件中添加以下依赖 <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --> <dependency&...

    图片灰度处理效果

    视频灰度处理效果

    javacv 视频图片灰度处理

     

    Java spring boot项目或者maven项目的pom文件中添加以下依赖  

    		<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
    		<dependency>
    			<groupId>org.bytedeco</groupId>
    			<artifactId>javacv-platform</artifactId>
    			<version>1.5.5</version>
    		</dependency>

     核心代码,单类实现,idea创建VideoGrayProcessor 类,复制粘贴下面代码,右键点击run运行主方法即可。

    图像灰度算法

    1. 取得每一个像素的red,green,blue值。

    2. 使用灰度算法,算出一个灰度值。

    3. 用这个灰度值代替像素原始的red,green,blue值。

    比如我们的灰度算法是:

    Gray = (Red + Green + Blue) / 3

    主要有图片文字水印和视频水印两个方法,大家可以根据自己的的需求对方法里的参数修改。

    
    import org.bytedeco.javacv.FFmpegFrameGrabber;
    import org.bytedeco.javacv.FFmpegFrameRecorder;
    import org.bytedeco.javacv.Frame;
    import org.bytedeco.javacv.Java2DFrameConverter;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    public class VideoGrayProcessor {
    
    
        final static String videoFolderPath = "C:/Users/tarzan/Desktop/video/";
        final static String videoName = "video.mp4";
        final static String imageFolderPath = "C:/Users/tarzan/Desktop/image/";
        final static String imageName = "logo.jpg";
    
    
        public static void main(String[] args) throws Exception {
    
            videoProcess(videoFolderPath + videoName);
    
            imageProcess(imageFolderPath + imageName);
    
        }
    
        //视频水印
        public static void videoProcess(String filePath) {
            //抓取视频图像资源
            FFmpegFrameGrabber videoGrabber = new FFmpegFrameGrabber(filePath);
            //抓取视频图像资源
            FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(filePath);
            try {
                videoGrabber.start();
                audioGrabber.start();
                FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFolderPath + "new" + videoName, videoGrabber.getImageWidth(), videoGrabber.getImageHeight(), videoGrabber.getAudioChannels());
                recorder.start();
                //处理图像
                int videoSize = videoGrabber.getLengthInVideoFrames();
                for (int i = 0; i < videoSize; i++) {
                    Frame videoFrame = videoGrabber.grabImage();
                    if (videoFrame != null && videoFrame.image != null) {
                        System.out.println("视频共" + videoSize + "帧,正处理第" + (i + 1) + "帧图片");
                        Java2DFrameConverter converter = new Java2DFrameConverter();
                        BufferedImage bi = converter.getBufferedImage(videoFrame);
                        BufferedImage bufferedImage = grayProcess(bi);
                        recorder.record(converter.convert(bufferedImage));
                    }
                }
                //处理音频
                for (int i = 0; i < audioGrabber.getLengthInAudioFrames(); i++) {
                    Frame audioFrame = audioGrabber.grabSamples();
                    if (audioFrame != null && audioFrame.samples != null) {
                        recorder.recordSamples(audioFrame.sampleRate, audioFrame.audioChannels, audioFrame.samples);
                    }
                }
                recorder.stop();
                recorder.release();
                videoGrabber.stop();
                audioGrabber.stop();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //图片灰度处理
        public static void imageProcess(String sourceFilePath) {
            try {
                BufferedImage image = ImageIO.read(new File(sourceFilePath));
                grayProcess(image);
                String format = sourceFilePath.substring(sourceFilePath.lastIndexOf(".") + 1);
                ImageIO.write(image, format, new File(imageFolderPath + "new" + imageName));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //灰度处理
        public static BufferedImage grayProcess(BufferedImage bufImg) {
            int width = bufImg.getWidth();
            int height = bufImg.getHeight();
            for (int i = 0; i < width; i++) {
                for (int j = 0; j < height; j++) {
                    bufImg.setRGB(i, j, grayRGB(bufImg.getRGB(i, j)));
                }
            }
            return bufImg;
        }
    
        //rgb灰度转换
        private static int grayRGB(int rgb) {
            int R = (rgb & 0xff0000) >> 16;
            int G = (rgb & 0x00ff00) >> 8;
            int B = rgb & 0x0000ff;
            //平均值
            String average = Integer.toHexString((R + G + B) / 3);
            if (average.length() == 1) {
                average = "0" + average;
            }
            //RGB都变成平均值
            return Integer.parseInt(average + average + average, 16);
        }
    
    
    }
    
    

    补充知识:

    RGB颜色是由红(Red)、绿(Green)、蓝(Blue)三原色组成的,所以可以使用这三个颜色的组合来代表一种具体的颜色,其中R、G、B的每个数值都位于0-255之间。在表达颜色的时候,即可以使用三个数字来表达,也可以使用一个格式如0X00RRGGBB这样格式的十六进制来表达,下面是常见颜色的表达形式:

      红色:(255,0,0)或0x00FF0000

      绿色:(0,255,0)或0x0000FF00

      蓝色:(0,0,255)或0x00FFFFFF 

    在编写java图像处理程序时,需要对图像进行灰度化和二值化处理,首先将颜色值与十六进制表示的00ff0000进行“与”运算,运算结果除了表示红色的数字值之外,GGBB部分颜色都为0,在将结果向右移位16位,得到的就是红色值。
    同样的,我们也可以通过以下代码得到green和blue的值:

    int red = (rgb & 0x00ff0000) >> 16;
    int green = (color & 0x0000ff00) >> 8; // 250 = 0xfa
    int blue = (color & 0x000000ff); // 255 = 0xff

    更多图像RGB知识可以百度一下。 

    控制台运行输出日志

    肯动脑筋的小伙伴,把代码稍加改造也可以做成纯黑白画视频。 

     相关文章推荐

    《震惊,java仅用30行代码就实现了视频转音频的批量转换》

    特别说明:如需转载此篇文章,请先关注本人后,注明作者名称,和文章链接地址即可。

    展开全文
  • 本节主要介绍对原生图像进行灰度处理,使得图像变为黑白色。

    什么是灰度图像

    灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。

    灰度图像解释

    一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。

    通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的。

    在计算机领域中,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。

    我们可以通过下面几种方法,将其转换为灰度:

    1.浮点算法:Gray=R*0.3+G*0.59+B*0.11

    2.整数方法:Gray=(R*30+G*59+B*11)/100

    3.移位方法:Gray =(R*76+G*151+B*28)>>8;

    4.平均值法:Gray=(R+G+B)/3;

    5.仅取绿色:Gray=G;

    通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

    知道了什么是灰度图像和转换方法后,我们来试试看:

    QAction *pgreyScale = new QAction(QStringLiteral("灰度(&H)"));
    connect(pgreyScale, &QAction::triggered, this, &heicExample::greyScale);
    pMenu2->addAction(pgreyScale);

    首先我们创建一个菜单按钮,并绑定槽函数。

    void heicExample::greyScale()
    {
    	QImage newImage(image.width(), image.height(), QImage::Format_ARGB32);
            QColor oldColor;
    
    	for (int x = 0; x < newImage.width(); x++) {
    		for (int y = 0; y < newImage.height(); y++) {
    			oldColor = QColor(image.pixel(x, y));
    			//QColor *pcolor = new QColor(oldColor.red(),oldColor.green(),oldColor.blue());
    			int average = (oldColor.red() + oldColor.green() + oldColor.blue()) / 3;
    			newImage.setPixel(x, y, qRgb(average, average, average));
    		}
    	}
    	if (pixItem)
    	{
    		m_graphicsScene->removeItem(pixItem);   //将上一个图元从场景中移除,重新添加新的图元
    		delete pixItem;
    		pixItem = NULL;
    	}
    	image_save = newImage.copy();
    	pixItem = new PixItem(QPixmap::fromImage(newImage));
    	//将该图元对象添加到场景中,并设置此图元在场景中的位置为中心(0,0)
    	m_graphicsScene->addItem(pixItem);
    	pixItem->setPos(0, 0);
    }

    上述代码主要使用了平均值法进行转换的,先获取图像的每个像素点的RGB颜色,然后对RGB的值取平均数,最后通过函数setPixel设置图像像素点色彩即可,别忘记保存图像。

    效果图献上!

    展开全文
  • iOS OpenCV 图像灰度处理

    千次阅读 2017-02-17 17:00:32
    有时候开发过程中,切图满足不了我们的需求,此时我们需要对图像进行灰度处理,例如QQ头像在线、离线等不同状态等。可以尝试的解决方案: 第一种:让UI重新切图 第二种:切图不顶用,用代码实现(重新生成带灰度...
  • 但经过灰度处理图像对象怎么得到呢?我想利用得到的图像进行处理,但处理的还是原来的图像,就算我保存当前的灰度图像,打开进行处理时依然是彩色图像的性质。 代码如下 ``` //打开图片 private void open_...
  • 彩色图像灰度处理公式:R*0.299+G*0.587+B*0.114 方式一:指针操作。 extern "C" { JNIEXPORT jintArray JNICALL Java_com_xy_opencv_ndk_1opencv002_MainActivity_grayPixels(JNIEnv *env, jclass ty
  • C# 图像灰度处理

    2012-09-19 11:16:51
    图像灰度化 24位彩色图像每个像素用三个字节表示,每个字节对应着R G B 分量的亮度(红黄蓝) 当R G B 分量值不同时,表现为彩色图像,当三个值相同时,表现为灰度图像 第一种转换公式 Gray(i,j) = [R(i,j) + G...
  • 原图图像灰度处理#方式1 import cv2 #读取彩色原图 img0=cv2.imread('E:/python_cv/01.jpg',1) #读取灰度图 img1=cv2.imread('E:/python_cv/01.jpg',0) print(img0.shape) print(img1.shape) cv2.imshow('gary',img1...
  • CxImage图像灰度处理简述

    千次阅读 2013-03-16 00:08:34
    )[+]引言 目标功能 使用 CxImage 原因 功能实现 灰度转换实现流程图 核心代码 开发中遇到的问题 结束语 1. 引言 本周的工作项是实现图像的二三值转换功能,因为之前没有做过这块的东西,故而记录下实现的过程。以便...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • 一、前言 本来打算下午,进行数据结构学习,但是啃了一上午高数之后,突然不想... [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算
  • 一、图像灰度化处理1、最大值灰度处理方法2、平均灰度处理方法3、加权平均灰度处理方法二、图像灰度线性变换1、图像灰度上移变换2、图像对比度增强变换3、图像对比度减弱变换4、图像灰度反色变换三、图像灰度非线性...
  • 1 图像灰度化原理 2 图像颜色空间转换 3 OpenCV图像灰度化处理 3.1 最大值灰度处理 3.2 平均灰度处理 3.3 加权平均灰度处理 参考资料 1 图像灰度化原理 在图像处理算法中,往往需要把彩色图像转换为灰度图像...
  • 本篇文章讲解图像灰度处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理。基础性知识希望对您有所帮助。 1.图像灰度化原理 2.基于OpenCV的图像灰度处理 3....
  • opencv-python的图像灰度处理与二值化处理 图像灰度值处理 ·· 图像灰度值处理是图片处理中最为重要的环节之一,它是其他包括但不限于特征提取,图像定为,OCR,图片降噪,图片加噪等等操作的前提过程,下面是一段...
  • .NET Core 图像处理(图像二值化,图像灰度化,图像灰度反转) ImageSharp 是支持.NET Core跨平台图形处理库,本文将利用ImageSharp库实现图像二值化,图像灰度化,图像灰度反转。 图像二值化 public static ...
  • 图像处理图像灰度

    万次阅读 多人点赞 2019-06-18 16:42:06
    灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0。所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰度值的象...
  • 1.图像灰度化 灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度, 范围一般从0到255 ,白色为255 ,黑色为0。所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该...
  • MATLAB图形图像处理——图像灰度变换,介绍matlab处理图像的基础知识、图像灰度变换的基础知识。 通过直方图均衡化改变图像对比度和亮度,将模糊的图像变清晰。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,146
精华内容 5,658
关键字:

图像灰度处理