2019-03-20 16:29:36 qq_38221114 阅读数 216
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

    20005 人正在学习 去看看 夏曹俊
clear all;clc;
%{
clear:清除工作空间的所有变量 
close all:关闭所有的Figure窗口 
clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响
%}

x = imread('image.jpg');
subplot(2,2,1)%划分2x2区域,在第一格显示
imshow(x)
y = rgb2gray(x);%变为灰度图像
subplot(2,2,2)
imshow(y)
z1 = im2bw(x,0.55);%二值化处理
subplot(2,2,3)
imshow(z1)
z2 = im2bw(x,0.95);
subplot(2,2,4)
imshow(z2)

imwrite(z1,'image1.jpg');%保存,格式任意

 

2017-10-24 21:49:27 Koala_Tree 阅读数 978
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

Question

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surrounding cells and itself. If a cell has less than 8 surrounding cells, then use as many as you can.

Example 1:

Input:
[[1,1,1],
 [1,0,1],
 [1,1,1]]
Output:
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]

Explanation:
For the point (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0
For the point (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0
For the point (1,1): floor(8/9) = floor(0.88888889) = 0

Note:

  • The value in the given matrix is in the range of [0, 255].
  • The length and width of the given matrix are in the range of [1, 150].

问题解析:

给定表示图像灰度的二维整数矩阵M,平滑图像,使每个单元格的灰度值成为所有包括周围8个单元格及其本身的平均灰度(舍入)。如果周围的单元格小于8个,则使用尽可能多的单元格。

Answer

Solution 1:

题目简单,遍历实现即可。

  • 对于这样的题目,我们一般来说第一反应是对每个点分三种情况进行讨论,处于角落的点用4个平滑,处于边的点用6个平滑,其它点用9个平滑。
  • 虽然上面直观的想法的算法运行时间可能不会很高,但是在实现上比较繁琐,这里我们换一个角度考虑。对于每一个点(暂时不考虑边角处点),计算该点的平滑时,共需要计算其本身及周围的9个点,也就是在该点的基础上在行和列上分别进行{-1,0,1}的索引计算,实现从左上角(-1,1)到右下角(1,1)的全部位置索引。我们用两个这样的for循环来实现。在进行计算前加入一个判断函数,来判断这样的点是否超出矩阵范围,如果超出则不进行计算。
  • 题目价值不高,理解就可以。
class Solution {
    public int[][] imageSmoother(int[][] M) {
        if (M == null) return null;
        int rows = M.length;
        if (rows == 0) return new int[0][];
        int cols = M[0].length;

        int result[][] = new int[rows][cols];

        for (int row = 0; row < rows; row++){
            for (int col = 0; col < cols; col++){
                int count = 0;
                int sum = 0;
                for (int rInc : new int[]{-1, 0, 1}){
                    for (int cInc : new int[]{-1, 0, 1}){
                        if (isValid(row + rInc, col + cInc, rows, cols)){
                            count++;
                            sum += M[row + rInc][col + cInc];
                        }
                    }
                }
                result[row][col] = sum / count;
            }
        }

        return result;
    }

    private boolean isValid(int x, int y, int rows, int cols){
        return x >=0 && x < rows && y >=0 && y < cols;
    }
}
  • 果然这样实现的耗时不比分情况判断的耗时少:beats 8.05 % of java submissions。
2018-01-10 20:47:54 k_means 阅读数 2013
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

      平时研究图像处理比较多,自然也少不了利用统计学的方法来查看图像的各种信息,最近手头写了一个用鼠标点击4个点,围成一个任意4边形,然后统计这个4边形内的灰度的平均值工具。(其实也不算什么工具,:-D)

实现思想:对一张图片A,建立一个掩膜,即:建立一个和图片大小一样的矩阵,让选择的那4个点内的数字为1,其他地方为0。之后再和图片A矩阵对应相乘,这样会只留下这个4边形内的像素值存在,其他地方的像素值都为0了。然后把这些像素值相加,再求平均就得出最终结果。

语言:c++

环境要求:Opencv(我用的是3.4版本)

      自然需要先为vs配置Opencv的环境,这个网上有很多教程:CSDN上面也有很多,回头我可以把一个超详细的链接放到这里,但是估计得先经过别人的同意,已经问过了,等待回复中。

下面贴代码:

#include <opencv2/highgui/highgui.hpp>  
#include<opencv2\opencv.hpp>
#include <opencv2/core/core.hpp>  
#include <iostream>
using namespace cv;
using namespace std;

//--定义几个全局变量,因为下面用到的onMouse没有返回值,所以只能通过全局变量来记录要获取的4个坐标的值。
Point pointCoo[4];
int clickNum = 0;

#define WINDOW "Pic"
void onMouse1(int event, int x, int y, int flag, void*) {
	if (event == EVENT_LBUTTONDOWN) {
		clickNum++;
		switch (clickNum) {
		case 1: pointCoo[0] = Point(x, y); break;
		case 2: pointCoo[1] = Point(x, y); break;
		case 3: pointCoo[2] = Point(x, y); break;
		case 4: pointCoo[3] = Point(x, y); break;
		default: break;
		}
		//点击一个坐标显示一次定义的全局变量pointCoo里面的值
		for (auto con : pointCoo)
			cout << con << endl;

	}

}


int avgGray(int(*p), Mat img) {

	//读入原图片,并获取长宽
	int length = img.rows;
	int width = img.cols;

	//建立一个全是0的图片掩膜
	Mat imgM(length, width, CV_8UC1, Scalar(0));

	Point points[1][4];
	points[0][0] = Point(p[0], p[1]);
	points[0][1] = Point(p[2], p[3]);
	points[0][2] = Point(p[4], p[5]);
	points[0][3] = Point(p[6], p[7]);

	//设定传入点的个数
	int npt[] = { 4 };

	//将四个点围成的区域像素变为1
	const Point *pt[1] = { points[0] };
	fillPoly(imgM, pt, npt, 1, Scalar(1));

	//将图片与掩膜对应相乘,得到只有区域部分非零的图像
	Mat reginImg = img.mul(imgM);

	namedWindow("image", WINDOW_AUTOSIZE);
	imshow("image", reginImg);
	waitKey(1000);
	//求出来四边形区域内这些像素值的总和。
	Scalar theSum = sum(reginImg);
	double theSumDouble = theSum.val[0]; //因为求和后是Scalar类型的数据,是含有一个4维数组的结构体,所以需要转化这个sum为double类型。
	int theNum = countNonZero(reginImg);   //求出这个四边形区域内有多少个像素值。
	int theAvg = theSumDouble / theNum;

	return theAvg;


}



int main() {
	Mat img = imread("X:/grayTest/QQ截图20180110154638.bmp", 0);
	namedWindow(WINDOW, WINDOW_AUTOSIZE);
	imshow(WINDOW, img);
	//waitKey(0);
	pointCoo[3].x = 0;
	setMouseCallback(WINDOW, onMouse1);
	
	//这个地方比较乱,因为我还没完全理解setMouseCallback怎么用,只能前面设定好pointCoo[3]中的x为0,然后在这里判断x是否已经被赋
	//新值来让图片刷新退出。比较low,忘见谅。
	while (int(pointCoo[3].x) == 0) {
		waitKey(2000);
	}
	int points[8] = { pointCoo[0].x, pointCoo[0].y, pointCoo[1].x, pointCoo[1].y,
		pointCoo[2].x, pointCoo[2].y, pointCoo[3].x, pointCoo[3].y };
	int theAvgGray = avgGray(points, img);    //定义theAvgGray来接收算出来的灰度平均值

	cout << "该区域的灰度平均值为:" << theAvgGray << endl;

	system("pause");
	return 0;
}


最后贴个图:



2017-03-29 20:25:27 jokertony 阅读数 11617
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

    20005 人正在学习 去看看 夏曹俊
椒盐噪声的特征非常明显,为图像上有黑色和白色的点。使用中值滤波可以很好的去除椒盐噪声。
设定中值滤波的尺寸为3*3. 即用滤波覆盖的9个格子的中间值代替该点的灰度值。
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 29 15:32:46 2017

@author: Joker
"""
from skimage import io
im=io.imread('b.jpg')
#io.imshow(im)
for i in range(0,im.shape[0]):
    for j in range(0,im.shape[1]):
        im_copy[i][j]=im[i][j]
#用3*3的中值滤波器
step=3
def m_filter(x,y):
    sum_s=[]
    for k in range(-int(step/2),int(step/2)+1):
        for m in  range(-int(step/2),int(step/2)+1):
            sum_s.append(im[x+k][y+m])
    sum_s.sort()
    return sum_s[(int(step*step/2)+1)]

for i in range(int(step/2),im.shape[0]-int(step/2)):
    for j in range(int(step/2),im.shape[1]-int(step/2)):
        im_copy[i][j]=m_filter(i,j)

io.imshow(im_copy)

原始图片
3*3的中值滤波
5*5的中值滤波
问题:3*3的中值滤波对椒盐噪声并不能完整去除。当扩大到5*5的尺寸时候。可以比较好的去出椒盐噪声。 但是出现的新的问题,边界的区域未处理的范围也随着扩大。想法:去除边界的两个像素区域,再将原始图片扩大尺寸。

2019-09-21 17:35:42 d__yz 阅读数 21
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

什么是数字图像

	数字图像:一个被抽样和量化后的 二维函数(光学方法产生),采用等距矩形网格抽样,对幅度进行等间隔量化

图像的分类

	按颜色和灰度的多少可以将图像分为二值图像、灰度图像、索引图像、真彩色RGB图像
	大多数图像处理软件都支持这4钟类型的图像

二值图像

	仅有0、1两个值构成的二维矩阵,0表示黑色,1表示白色。
	数据类型:二进制位
	用途:文字、线条图的扫描识别(OCR)和掩膜图像的存储

灰度图像

	矩阵取值范围为[0,255],0表示纯黑色,255表示纯白色,中间值为纯黑色到纯白色 的过渡色
	数据类型:八位无符号整形
	也可以取值[0,1],二值图像是特殊的灰度图像

索引图像

	由图像的二维矩阵+颜色的索引矩阵MAP构成
	图像的二维矩阵存放灰度值,而索引矩阵MAP存放RGB颜色,每一行的二维矩阵的灰度值对应着MAP矩阵的颜色,通过改变索引矩阵即MAP,颜色的形式可以调整的
	**图像在屏幕上显示时,每一像素的颜色由存放在矩阵中像素的灰度值作为索引通过检索颜色索引矩阵MAP得到**
	数据类型:八位无符号整形
	用途:存放色彩要求比较简单的图像

真彩色RGB图像

	RGB图像每一个像素的颜色值直接存放在图像矩阵中
	3个MxN的二维矩阵分别存放着R、G、B三个颜色分量
	数据类型:8位无符号的整形
	用途:存放真彩色图像、灰度图像

图像文件格式

图像是对人类感知外界信息能力的一种增强形式,是自然界景物的客观反映,是各种观测系统以不同形式和手段观测客观世界而获得的、可以直接或间接作用于人眼的实体。
BMP格式:几乎不进行压缩,占用存储空间大,能被多种Windows应用程序所支持
GIF格式:用来交换图片的,压缩比高,存储空间占用少、不能存储超过256色的图像
JPEG格式:扩展名为.jpg或.jpeg,有损压缩方式去除冗余的图像和彩色数据,具有调节图像质量的功能,用于web浏览图像
JPEG2000格式:具有高压缩率和更多新功能的静态影像压缩技术,支持有损和无损压缩,实现渐进传输(先传轮廓,后传数据),用于扫描仪,数码相机等
TIFF格式:Mac中广泛使用的图像格式,图像格式复杂、存储信息多,有利于原稿的复制,压缩采用LZW无损压缩方案存储,兼容性差
PNG格式:网络图像格式,不失真格式,存储形式丰富,兼有GIF和JPEG的色彩模式,能把图像文件压缩到极限以利于网络传输但还保留所有与图像品质有关的信息,显示速度快,支持透明图像(用网页本身的颜色来代替设为透明的色彩)的制作,不支持动画应用效

数字图像处理基础

阅读数 389

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