2019-10-29 21:00:33 qq_36511401 阅读数 7149
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19946 人正在学习 去看看 夏曹俊

1、介绍。

    通道。三通道一般指彩色图片,分别为R、G、B通道,我们所见的彩色图片,则是这三个通道叠加的效果。四通道一般是指在三通道的基础上再加上一个透明度的通道。单通道一般指灰度图,但是三通道如果每个像素的三个通道值都相等的话,我们也称为灰度图。

    灰度图。Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。因为彩色图片每个像素有三个字节(24bit)的值,怎么样才能取到一字节(8bit)的灰度等级呢。我们一般有7种方法:最小值法、最大值法、平均值法、加权法、红色值法、绿色值法和蓝色值法。

    下面我会介绍这7种方法,以下图所示的源图为例。

2、代码。生成两个文件夹,一个存放单通道的图像,另一个存放是三通道的图像。每个文件夹都会各生成7种不同方法灰度化处理的图像。至于使用哪种方法,要看具体的例子。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class ImgTest {
    private static final byte Gray_Type_Min = 1;//最大值法
    private static final byte Gray_Type_Max = 2;//最小值法
    private static final byte Gray_Type_Average = 3;//平均值法
    private static final byte Gray_Type_Weight = 4;//加权法
    private static final byte Gray_Type_Red = 5;//红色值法
    private static final byte Gray_Type_Green = 6;//绿色值法
    private static final byte Gray_Type_Blue = 7;//蓝色值法

    private static final String File_Path = "G:\\xiaojie-java-test\\img\\%s\\%s.jpg";
    private static final String Source_Path = "G:\\xiaojie-java-test\\img\\source.jpg";

    public static void main(String[] args) {
        //图片灰度化
        toGrayImg(Gray_Type_Min, "gray_min");//最大值法
        toGrayImg(Gray_Type_Max, "gray_max");//最小值法
        toGrayImg(Gray_Type_Average, "gray_average");//平均值法
        toGrayImg(Gray_Type_Weight, "gray_weight");//加权法
        toGrayImg(Gray_Type_Red, "gray_color_red");//红色值法
        toGrayImg(Gray_Type_Green, "gray_color_green");//绿色值法
        toGrayImg(Gray_Type_Blue, "gray_color_blue");//蓝色值法
    }

    /**
     * 图片灰度化的方法
     *
     * @param type         灰度化方法
     * @param grayFileName 目标图片文件名
     */
    private static void toGrayImg(int type, String grayFileName) {
        try {
            BufferedImage image = ImageIO.read(new File(Source_Path));
            final int imgWidth = image.getWidth();
            final int imgHeight = image.getHeight();
            BufferedImage bufferedImage_1 = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_BYTE_GRAY);
            BufferedImage bufferedImage_3 = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
            //这边因为只是灰度操作,所以内外循环imgWidth和imgHeight可以随便放
            for (int i = 0; i < imgHeight; i++) {
                for (int j = 0; j < imgWidth; j++) {
                    final int pixel = image.getRGB(j, i);
                    final int[] grb = getRgb(pixel);
                    final int gray = getGray(grb, type);
                    bufferedImage_1.setRGB(j, i, (byte) gray);//这里一定要用byte类型的,不然图片会很暗
                    bufferedImage_3.setRGB(j, i, getPixel(gray, gray, gray));
                    //System.out.print(String.format("%4d ", gray));
                }
                //System.out.println();
            }
            ImageIO.write(bufferedImage_1, "JPEG", new File(String.format(File_Path, "单通道-灰度图", grayFileName)));
            Thread.sleep(1);
            ImageIO.write(bufferedImage_3, "JPEG", new File(String.format(File_Path, "三通道-灰度图", grayFileName)));
            Thread.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //将一个int值转化为3个r、g个b的byte值
    private static int[] getRgb(int pixel) {
        int[] rgb = new int[3];
        rgb[0] = (pixel >> 16) & 0xff;
        rgb[1] = (pixel >> 8) & 0xff;
        rgb[2] = pixel & 0xff;
        return rgb;
    }

    //将3个r、g个b的byte值转化为一个int值
    private static int getPixel(int r, int g, int b) {
        int getPixel = b;
        getPixel += (r << 16);
        getPixel += (g << 8);
        return getPixel;
    }

    //根据不同的灰度化方法,返回byte灰度值
    private static int getGray(int[] rgb, int type) {
        if (type == Gray_Type_Average) {
            return (rgb[0] + rgb[1] + rgb[2]) / 3;   //rgb之和除以3
        } else if (type == Gray_Type_Weight) {
            return (int) (0.3 * rgb[0] + 0.59 * rgb[1] + 0.11 * rgb[2]);
        } else if (type == Gray_Type_Red) {
            return rgb[0];//取红色值
        } else if (type == Gray_Type_Green) {
            return rgb[1];//取绿色值
        } else if (type == Gray_Type_Blue) {
            return rgb[2];//取蓝色值
        }
        //比较三个数的大小
        int gray = rgb[0];
        for (int i = 1; i < rgb.length; i++) {
            if (type == Gray_Type_Min) {
                if (gray > rgb[i]) {
                    gray = rgb[i];//取最小值
                }
            } else if (type == Gray_Type_Max) {
                if (gray < rgb[i]) {
                    gray = rgb[i];//取最大值
                }
            }
        }
        return gray;
    }
}

3、结果。

 

2019-11-29 11:45:17 qq_30072889 阅读数 51
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19946 人正在学习 去看看 夏曹俊

灰度图像转化rgb2gray

matlab_Code
close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
X=imread(‘football.jpg’); %读取文件格式为.jpg,文件名为football的RGB图像的信息
I=rgb2gray(X); %将RGB图像转换为灰度图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
subplot(121),imshow(X); %显示原RGB图像
subplot(122),imshow(I); %显示转换后灰度图像
Result在这里插入图片描述

灰度图像转化rgb2ind

close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
RGB = imread(‘football.jpg’); %读取图像信息
[X1,map1]=rgb2ind(RGB,64); %将RGB图像转换成索引图像,颜色种数N是64种
[X2,map2]=rgb2ind(RGB,0.2); %将RGB图像转换成索引图像,颜色种数N是216种
map3= colorcube(128); %创建一个指定颜色数目的RGB颜色映射表
X3=rgb2ind(RGB,map3);
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure;
subplot(131),imshow(X1,map1); %显示用最小方差法转换后索引图像
subplot(132),imshow(X2,map2); %显示用均匀量化法转换后索引图像
subplot(133),imshow(X3,map3); %显示用颜色近似法转换后索引图像
在这里插入图片描述

灰度图像向索引图像的转换gray2ind

close all %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc %清屏
I = imread(‘cameraman.tif’) %读取灰度图像信息
[X,map]=gray2ind(I,8); %实现灰度图像向索引图像的转换,N取8
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure,imshow(I); %显示原灰度图像
figure, imshow(X, map); %显示N=8转换后索引图像
在这里插入图片描述
在这里插入图片描述

将灰度图像转换为索引图像grayslice

close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
I = imread(‘coins.png’); %读取图像信息
X = grayslice(I,32); %将灰度图像转换为索引图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure,imshow(I); %显示原图像
figure,imshow(X,jet(32)); %jet(M)是相当于colormap,是一个M×3的数组
在这里插入图片描述
在这里插入图片描述

索引图像转换为灰度图像ind2gray

close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
[X,map]=imread(‘forest.tif’);%像信息
I = ind2gray(X,map); %再将索引图像转换为灰度图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure,imshow(X,map); %将索引图像显示
figure,imshow(I); %将灰度图像显示
在这里插入图片描述
在这里插入图片描述

索引图像转换为真彩色图像ind2rgb

[X,map]=imread(‘kids.tif’); %读取图像信息
RGB=ind2rgb(X,map); %将索引图像转换为真彩色图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure, imshow(X,map); %显示原图像
figure,imshow(RGB); %显示真彩色图像

在这里插入图片描述

灰度图像转换为二值图像im2bw

I=imread(‘rice.png’); %读取图像信息
BW1=im2bw(I,0.4); %将灰度图像转换为二值图像,level值为0.4
BW2=im2bw(I,0.6); %将灰度图像转换为二值图像,level值为0.6
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure;
subplot(131),imshow(I); %显示level=0.4转换后的二值图像
subplot(132),imshow(BW1); %显示level=0.5转换后的二值图像
subplot(133),imshow(BW2); %显示level=0.6转换后的二值图像

在这里插入图片描述

索引图像转换为二值图像im2bw

load trees; %从文件‘trees。mat’中载入数据到workplace
BW = im2bw(X,map,0.4); %将缩=索引图像转换为二值图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure, imshow(X,map); %显示原索引图像
figure, imshow(BW); %显示转换后二值图像

在这里插入图片描述
在这里插入图片描述

RGB图像转换为二值图像im2bw

I=imread(‘pears.png’); %读取图像信息
BW=im2bw(I,0.5); %将RGB图像转换为二值图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure,
subplot(121),imshow(I); %显示原图像
subplot(122),imshow(BW); %显示转换后二值图像

在这里插入图片描述

矩阵J转换为灰度图像mat2gray

X=magic(256);
I= mat2gray(X); %将矩阵J转换为灰度图像
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
imshow(I); %显示转换后灰度图像
在这里插入图片描述

对灰度图像G进行2次滤波,实现边缘检测filter2

I=imread(‘tire.tif’); %读取图像信息
H=[1 2 1;0 0 0;-1 -2 -1]; %设置subol算子
X=filter2(H,I); %对灰度图像G进行2次滤波,实现边缘检测
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]); %修改图形背景颜色的设置
figure,
subplot(131),imshow(I);
subplot(132),imshow(X,[]),colorbar(); %显示图像,并添加颜色条
subplot(133),imshow(X,[]),colorbar(‘east’);
在这里插入图片描述

读取多帧图像序列

close all; %关闭当前所有图形窗口
clear all; %清空工作空间变量
clc; %清屏
I=zeros(128,128,1,27); %建立四维数组I
for i=1:27
[I(:,:,:,i),map]=imread(‘mri.tif’,i); %读取多帧图像序列,存放在数组I中
end
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]) %修改图形背景颜色的设置
montage(I,map); %将多帧图像同时显示
在这里插入图片描述

二维图像纹理映射三维球体表面warp

clc; %清屏
%I=imread(‘testpat.png’);
I=imread(‘football.jpg’); %读取图像信息
[x,y,z]=sphere; %创建三个(N+1)×(N+1)的矩阵,使得surf(X,Y,Z)建立一个球体,缺省时N取20
set(0,‘defaultFigurePosition’,[100,100,1000,400]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]) %修改图形背景颜色的设置
figure,
subplot(121),warp(I); %显示图像映射到矩形平面
subplot(122),warp(x,y,z,I); %将二维图像纹理映射三维球体表面
grid; %建立网格
在这里插入图片描述

交互式用鼠标选择像素

clc; %清屏
RGB = imread(‘peppers.png’); %读取图像信息
c = [12 146 410]; %新建一个向量c,存放像素纵坐标
r = [104 156 129]; %新建一个向量r,存放像素横坐标
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]) %修改图形背景颜色的设置
pixels1=impixel(RGB) %交互式用鼠标选择像素
pixels2= impixel(RGB,c,r) %将像素坐标作为输入参数,显示特定像素的颜色值

图像像素信息显示工具impixelinfo

close all; %关闭当前所有图形窗口
clear all %清空工作空间变量
clc; %清屏
set(0,‘defaultFigurePosition’,[100,100,1000,500]); %修改图形图像位置的默认设置
set(0,‘defaultFigureColor’, [1 1 1]) %修改图形背景颜色的设置
h = imshow(‘hestain.png’); %显示图像
hp = impixelinfo; %创建图像像素信息显示工具
set(hp,‘Position’,[150 290 300 20]); %设置像素信息工具显示的位置
figure
imshow(‘trees.tif’);
impixelinfo %创建图像像素信息显示工具
在这里插入图片描述
在这里插入图片描述

2018-01-08 14:40:56 u013070165 阅读数 2209
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19946 人正在学习 去看看 夏曹俊

ImageSharp 是支持.NET Core跨平台图形处理库,本文将利用ImageSharp库实现图像二值化,图像灰度化,图像灰度反转。

  • 图像二值化
public static Image<Rgba32> Binaryzation(Image<Rgba32> image)
{
     int avg = 0;
     for (int i = 0; i < image.Width; i++)
     {
         for (int j = 0; j < image.Height; j++)
         {
             var color = image.GetPixelReference(i, j);
             avg += color.B;
         }
     }
     avg = (int)avg / (image.Width * image.Height);

     for (int i = 0; i < image.Width; i++)
     {
         for (int j = 0; j < image.Height; j++)
         {
             //获取该像素点的RGB的颜色
             var color = image.GetPixelReference(i, j);
             int value = 255 - color.B;
             //计算颜色,大于平均值为黑,小于平均值为黑
             Color newColor = value > avg ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255,255,255);
             //修改该像素点的RGB的颜色
             image.GetPixelReference(i, j).Rgba =(uint)newColor.ToArgb();
         }
     }
     return image;
}
  • 图像灰度化
public static Image<Rgba32> GrayProcessing(Image<Rgba32> image)
{
    for (int i = 0; i < image.Width; i++)
    {
        for (int j = 0; j < image.Height; j++)
        {
            //获取该像素点的RGB的颜色
            var color = image.GetPixelReference(i, j);
            //计算灰度值
            int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
            Color newColor = Color.FromArgb(gray, gray, gray);
            //修改该像素点的RGB的颜色
            image.GetPixelReference(i, j).Rgba = (uint)newColor.ToArgb();
        }
    }
    return image;
}
  • 图像灰度反转
 public static Image<Rgba32> GrayReversal(Image<Rgba32> image)
 {
     for (int i = 0; i < image.Width; i++)
     {
         for (int j = 0; j < image.Height; j++)
         {
             //获取该像素点的RGB的颜色
             var color = image.GetPixelReference(i, j);
             //取相反色
             Color newColor = Color.FromArgb(255-color.R,255-color.G,255-color.B);
             //修改该像素点的RGB的颜色
             image.GetPixelReference(i, j).Rgba = (uint)newColor.ToArgb();
         }
     }
     return image;
 }
2019-03-29 20:51:13 Tifa_Best 阅读数 217
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19946 人正在学习 去看看 夏曹俊

要求

  1. 利用 OpenCV 读取图像。
    具体内容:用打开 OpenCV 打开图像,并在窗口中显示
  2. 灰度图像二值化处理
    具体内容:设置并调整阈值对图像进行二值化处理。
  3. 灰度图像的对数变换
    具体内容:设置并调整 r 值对图像进行对数变换。
  4. 灰度图像的伽马变换
    具体内容:设置并调整γ值对图像进行伽马变换。
  5. 彩色图像的补色变换
    具体内容:对彩色图像进行补色变换。

过程

灰度变换

灰度变换的定义域和值域应该相等吧。

伽马变换: s=crγr[0,1]s=cr^\gamma \qquad r\in[0,1]

对数变换: s=clogv+1(1+vr)r[0,1]s=c\log_{v+1}(1+vr)\qquad r\in[0,1]

C++的functional库

整个处理流程大致相同,只有几个变换公式不同,所以把公共部分抽象出来成为一个函数,在每个变换中调用公共处理函数。

之前打算因为几个变换的函数实现中的参数个数不同,所以打算用bind的,后来发现lambda更简洁实用些。

function基本上代替了函数指针。

虽然花费了不少时间,但算是搞懂了function、bind和lambda的区别与用法。

代码

注意:补色被我理解成反色了,代码中的这个实现错误我也懒得改了。。。

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

#include <string>
#include <iostream>
#include <functional>

using namespace cv;
using namespace std;

void apply_LUT(Mat &src, Mat &dst, function<uchar(uchar)> pf)
{
    CV_Assert(src.depth() == CV_8U);

    Mat lookUpTable(1, 256, CV_8U);
    uchar* p = lookUpTable.ptr();
    for(int i = 0; i < 256; ++i)
        p[i] = pf(i);
    LUT(src, lookUpTable, dst);
    imshow("image", dst);
    waitKey(0);
}
void threshold_transform(Mat &src, Mat &dst, uchar thre)
{
    auto fun = [=](uchar r) -> uchar {return ((r > thre) ? 1 : 0) * 255;};
    apply_LUT(src, dst, fun);
}

// $s=cr^\gamma \qquad r\in[0,1]$
void gamma_transform(Mat &src, Mat &dst, float g=2, float c = 1.0)
{
    auto fun = [=](uchar r) -> uchar {return (c * pow(r/255., g)*255);};
    apply_LUT(src, dst, fun);
}

// $s=c\log_{v+1}(1+vr)\qquad r\in[0,1]$
void log_transform(Mat &src, Mat &dst, float v=1, float c=1)
{
    auto fun = [=](uchar r) -> uchar {
        return (c * 255. * log(1. + v*r/255.) / log(v + 1));};
    apply_LUT(src, dst, fun);
}

void inv_transform(Mat &src, Mat &dst)
{
    auto fun = [=](uchar r) -> uchar {return (255 - r);};
    apply_LUT(src, dst, fun);
}

int main (int argc, char **argv)
{
    String image_name((argc>1)?(argv[1]):("img_test.jpg"));
    Mat image, image_gray, image_dst;
    image = imread(image_name, IMREAD_COLOR);
    if (image.empty()) {
        cout << "Cannot read image: " << image_name << std::endl;
        return -1;
    }   
    cvtColor(image, image_gray, CV_BGR2GRAY);

    namedWindow("image", CV_WINDOW_AUTOSIZE);
    cout << "image origin" << endl;
    imshow("image", image);
    waitKey(0);

    cout << "image gray" << endl;
    imshow("image", image_gray);
    waitKey(0);

    cout << "image threshold" << endl;
    // threshold(image_gray, image_dst, 128, 255, THRESH_BINARY);
    threshold_transform(image_gray, image_dst, 128);

    cout << "image log" << endl;
    log_transform(image_gray, image_dst, 7);

    cout << "image gamma" << endl;
    gamma_transform(image_gray, image_dst, 9);

    cout << "image inv" << endl;
    inv_transform(image, image_dst);

    return 0;
}
2019-05-04 11:03:38 zaishuiyifangxym 阅读数 822
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19946 人正在学习 去看看 夏曹俊

目录

1 图像灰度化原理

2 图像颜色空间转换

3 OpenCV图像灰度化处理

3.1 最大值灰度处理

3.2 平均灰度处理

3.3 加权平均灰度处理

参考资料


1 图像灰度化原理

在图像处理算法中,往往需要把彩色图像转换为灰度图像。图像灰度化是将一幅彩色图像转换为灰度化图像的过程。彩色图像通常包括R、G、B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的R、G、B三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度,灰度值大的像素点比较亮,反之比较暗,像素值最大为255(表示白色),像素值最小为0(表示黑色)。假设某点的颜色由RGB(R,G,B)组成,常见灰度处理算法有:

       算法名称                           算法公式 

 最大值灰度处理

              gray=\max (R,G,B)

   浮点灰度处理

     gray=0.3R+0.59G+0.11B

   整数灰度处理

   gray=(30R+59G+11B)/100

   移位灰度处理

  gray=(28R+151G+77B)>>8

   平均灰度处理

                 gray=(R,G,B)/3

加权平均灰度处理

 gray=0.299R+0.587G+0.144B

其中,常见的灰度处理方法是将RGB三个分量求和再取平均值,但更为准确的方法是设置不同的权重,将RGB分量按不同的比例进行灰度划分。比如人类的眼睛感官蓝色的敏感度最低,敏感最高的是绿色,因此将RGB按照0.299、0.587、0.144比例加权平均能得到较合理的灰度图像

                                                                             gray=0.299R+0.587G+0.144B


 

2 图像颜色空间转换

在日常生活中,我们看到的大多数彩色图像都是RGB类型,但是在图像处理过程中,常常需要用到灰度图像、二值图像、HSV、HSI等颜色,OpenCV提供了 cvtColor() 函数实现这些功能。

OpenCV中 cvtColor() 函数形式如下所示:

dst = cv2.cvtColor(src, code[, dst[, dstCn]])

src 表示输入图像,需要进行颜色空间变换的原图像;

dst 表示输出图像,其大小和深度与src一致;

code 表示转换的代码或标识;

dstCn 表示目标图像通道数,其值为0时,则有src和code决定。

该函数的作用是将一个图像从一个颜色空间转换到另一个颜色空间,其中,RGB是指Red、Green和Blue,一幅图像由这三个通道(channel)构成;Gray表示只有灰度值一个通道;HSV包含Hue(色调)、Saturation(饱和度)和Value(亮度)三个通道。在OpenCV中,常见的颜色空间转换标识包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS等。

下面是调用 cvtColor() 函数将图像颜色空间转换(BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB 和 YUV)

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取原始图像
img_BGR = cv2.imread('zxp.jpg')

#BGR转换为RGB
img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)

#灰度化处理
img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)

#BGR转HSV
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)

#BGR转YCrCb
img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)

#BGR转HLS
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)

#BGR转XYZ
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)

#BGR转LAB
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)

#BGR转YUV
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)

#调用matplotlib显示处理结果
titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV']
images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb,
          img_HLS, img_XYZ, img_LAB, img_YUV]
for i in range(9):
   plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:


 

3 OpenCV图像灰度化处理

下面主要介绍最大值灰度处理平均灰度处理加权平均灰度处理 算法。

3.1 最大值灰度处理

该方法的灰度值等于彩色图像R、G、B三个分量中的最大值,公式如下:

                                                                               gray=\max (R,G,B)

 

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('zxp.jpg')

#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]

#创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)

#图像最大值灰度处理
for i in range(height):
    for j in range(width):
        #获取图像R G B最大值
        gray = max(img[i,j][0], img[i,j][1], img[i,j][2])
        #灰度图像素赋值 gray=max(R,G,B)
        grayimg[i,j] = np.uint8(gray)

#显示图像
cv2.imshow("src", img)
cv2.imshow("gray", grayimg)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:(处理效果的灰度偏亮

 

 

3.2 平均灰度处理

该方法的灰度值等于彩色图像R、G、B三个分量灰度值的求和平均值,其计算公式如下所示:

                                                                                    gray=(R,G,B)/3

 

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('zxp.jpg')

#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]

#创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
# print (grayimg)

#图像平均灰度处理方法
for i in range(height):
    for j in range(width):
        #灰度值为RGB三个分量的平均值
        gray = (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2]))  /  3
        grayimg[i,j] = np.uint8(gray)

#显示图像
cv2.imshow("src", img)
cv2.imshow("gray", grayimg)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 

 

3.3 加权平均灰度处理

该方法根据色彩重要性,将三个分量以不同的权值进行加权平均。常见的灰度处理方法是将RGB三个分量求和再取平均值,但更为准确的方法是设置不同的权重,将RGB分量按不同的比例进行灰度划分。比如人类的眼睛感官蓝色的敏感度最低,敏感最高的是绿色,因此将RGB按照0.299、0.587、0.144 比例加权平均能得到较合理的灰度图像:

                                                                       gray=0.299R+0.587G+0.144B

 

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取原始图像
img = cv2.imread('zxp.jpg')

#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]

#创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
# print grayimg

#图像加权平均灰度处理方法
for i in range(height):
    for j in range(width):
        #灰度加权平均法
        gray = 0.30 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2]
        grayimg[i,j] = np.uint8(gray)

#显示图像
cv2.imshow("src", img)
cv2.imshow("gray", grayimg)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


 

参考资料

[1] https://blog.csdn.net/Eastmount/article/details/88785768

[2] Python+OpenCV图像处理

图像处理--灰度图

阅读数 118

没有更多推荐了,返回首页