2018-08-16 11:04:08 qq_35651357 阅读数 2069
  • 一小时快速学习屏幕录像和视频编辑实战教程

    本套课程全程采用实例演示,思路清晰,易学易操作。课程包括屏幕录像、视频编辑、视频压缩,一套完整的课程。屏幕录像部分教大家用简单实用的方法录制高清视频,视频编辑部分包括视频裁剪、分割、合并、字幕、水印、画中画、分屏、马赛克、绿幕抠像、变声变速、换音乐等等,视频压缩教大家如何压缩视频而且不影响视觉清晰度,压缩体积方便上传和下载。

    328 人正在学习 去看看 陈虎

马赛克是一种广为使用的图像处理手段,它是将影像特定区域的色阶细节劣化并造成色块打乱的效果。这种模糊看样子像一个个小格子,所以被称为马赛克。马赛克主要的目的就是使图像内容无法辨认,以保护特殊图像内容。这样的例子我们经常遇到,例如在新闻中保护当事人的隐私。

图像加马赛克类似与图像重采样。我们在实验中采用的算法就是比较简单的加马赛克的算法,就是按固定间隔取像素点,将图片分割成一些嗯小块,每个小块的灰度值取左上角的像素值。我们在实验中是将图像分割为8*8的小块。其核心代码如下。

 

效果图

void CyuhuachangView::OnMosaic()
{
	setGrayimage();
	int i, j, ii, jj;
	BYTE temp;
	for (i = 0; i <nHeight; i++)
	{
		for (j = 0; j <nWidth; j++)
		{
			ii = int(i / 8) * 8;
			jj = int(j / 8) * 8;
			temp = m_pPixel[ii*nWidth + jj];
			grayImage[i*nWidth + j] = temp;
		}
	}
	former_pPixel = m_pPixel;
	m_pPixel = grayImage;
	Invalidate(TRUE);
}

 

2019-02-15 22:00:16 KID_yuan 阅读数 2113
  • 一小时快速学习屏幕录像和视频编辑实战教程

    本套课程全程采用实例演示,思路清晰,易学易操作。课程包括屏幕录像、视频编辑、视频压缩,一套完整的课程。屏幕录像部分教大家用简单实用的方法录制高清视频,视频编辑部分包括视频裁剪、分割、合并、字幕、水印、画中画、分屏、马赛克、绿幕抠像、变声变速、换音乐等等,视频压缩教大家如何压缩视频而且不影响视觉清晰度,压缩体积方便上传和下载。

    328 人正在学习 去看看 陈虎

简单实现MATLAB对RGB彩色图像进行加马赛克处理

为了加深对图像中像素块操作的记忆,利用像素块内均值方式对RGB彩色图像进行马赛克效果的处理;为了能后比较简单得实现,所以采用了n*n像素块大小的均值的方式。
为了比较简单实现,这里对RGB彩色图像三个通道分别采用了相同的均值操作,最后再利用MATLAB中的cat()函数将其合成三通道彩色图像。
代码如下:

%图片加马赛克练习
%均值处理方式加马赛克
%参数说明:f表示原图;fr,fg,fb表示原图的RGB三个通道
%imgn表示新图像
%imgnr,imgng,imgnb表示新图像的三个通道,分别用于存储新的图像
%n*n表示设置的马赛克区域像素块的大小

clear all;
close all;
clc;
%原图的路径
f = imread('F:\MATLAB2017b\MOutputResults\saber7.jpg');

%将源图像三个通道值取出
fr = f(:,:,1);
fg = f(:,:,2);
fb = f(:,:,3);
%由于原图像是三维h*w*3,求出单通道图像的大小
[h w] = size(fr);

%设置三个零矩阵用于存储新图像
imgnr = zeros(h,w);
imgng = zeros(h,w);
imgnb = zeros(h,w);

%设置马赛克区域n*n像素块大小
n = 20;
nh = floor(h/n)*n;%将不一定是n的整数倍的图像大小化为整数倍
nw = floor(w/n)*n;

%对R通道进行处理

for j = 1:n:nh
    for i = 1:n:nw
        imgnr(j:j+n-1, i:i+n-1) =mean(mean(fr(j:j+n-1, i:i+n-1)));%对列进行取均值处理
    end
    imgnr(j:j+n-1,nw:w ) = mean(mean(fr(j:j+n-1,nw:w )));%处理最后的列
end
for i = 1:n:nw
    imgnr(nh:h, i:i+n-1) = mean(mean(fr(nh:h, i:i+n-1)));%处理最后的行
end
imgnr(nh:h, nw:w) = mean(mean(fr(nh:h, nw:w)));%处理最后的角
 
%处理G通道
for j = 1:n:nh
    for i = 1:n:nw
        imgng(j:j+n-1, i:i+n-1) =mean(mean(fg(j:j+n-1, i:i+n-1))); 
    end
    imgng(j:j+n-1, nw:w) = mean(mean(fg(j:j+n-1, nw:w)));
end
for i = 1:n:nw
    imgng(nh:h, i:i+n-1) = mean(mean(fg(nh:h, i:i+n-1)));
end
imgng(nh:h, nw:w) = mean(mean(fg(nh:h, nw:w)));

%处理B通道
for j = 1:n:nh
    for i = 1:n:nw
        imgnb(j:j+n-1, i:i+n-1) = mean(mean(fb(j:j+n-1, i:i+n-1)));
    end
    imgnb(j:j+n-1, nw:w) = mean(mean(fb(j:j+n-1, nw:w)));
end
for i = 1:n:nw
    imgnb(nh:h,i:i+n-1) = mean(mean(fb(nh:h, i:i+n-1)));
end
imgnb(nh:h, nw:w) = mean(mean(fb(nh:h, nw:w)));

%三通道图像合成
imgnr = im2double(imgnr)/255;
imgng = im2double(imgng)/255;
imgnb = im2double(imgnb)/255;
imgn = cat(3,imgnr, imgng, imgnb);
imshowpair(f,imgn,'montage');%两张图片显示
title('原图                                                  马赛克处理后图像');

效果如下:

saber
由于实际上对RGB每个通道的处理操作都是一样的,因此还可以将原图三个通道的过程写成一个for循环。
代码为:

clear all;
close all;
clc;
%原图的路径
f = imread('F:\MATLAB2017b\MOutputResults\saber7.jpg');

% %将源图像单个通道值取出
fr = f(:,:,1);
[h w] = size(fr);
imgn = f;

%设置马赛克区域n*n像素块大小
n = 20;
nh = floor(h/n)*n;%将不一定是n的整数倍的图像大小化为整数倍
nw = floor(w/n)*n;

%对三个通道进行循环处理
for t = 1:3
    for j = 1:n:nh
        for i = 1:n:nw
            imgn(j:j+n-1, i:i+n-1, t) =mean(mean(f(j:j+n-1, i:i+n-1, t)));%对列进行取均值处理
        end
        imgn(j:j+n-1,nw:w , t ) = mean(mean(f(j:j+n-1,nw:w , t)));%处理最后的列
    end
    for i = 1:n:nw
        imgn(nh:h, i:i+n-1, t) = mean(mean(f(nh:h, i:i+n-1, t)));%处理最后的行
    end
    imgn(nh:h, nw:w, t) = mean(mean(f(nh:h, nw:w , t)));%处理最后的角
    
end

imshowpair(f,imgn,'montage');%两张图片显示
title('原图                                                  马赛克处理后图像');

最后运行结果一样。

2015-04-15 12:34:15 Trent1985 阅读数 2239
  • 一小时快速学习屏幕录像和视频编辑实战教程

    本套课程全程采用实例演示,思路清晰,易学易操作。课程包括屏幕录像、视频编辑、视频压缩,一套完整的课程。屏幕录像部分教大家用简单实用的方法录制高清视频,视频编辑部分包括视频裁剪、分割、合并、字幕、水印、画中画、分屏、马赛克、绿幕抠像、变声变速、换音乐等等,视频压缩教大家如何压缩视频而且不影响视觉清晰度,压缩体积方便上传和下载。

    328 人正在学习 去看看 陈虎


[函数名称]

  图像马赛克效果        MosaicProcess(WriteableBitmap src, int v)

[算法说明]

  图像马赛克效果其实就是将图像分成大小一致的图像块,每一个图像块都是一个正方形,并且在这个正方形中所有像素值都相等。我们可以将这个正方形看作是一个模板窗口,模板中对应的所有图像像素值都等于该模板的左上角第一个像素的像素值,这样的效果就是马赛克效果,而正方形模板的大小则决定了马赛克块的大小,即图像马赛克化的程度。

[函数代码]



<strong>       /// <summary>
        /// Mosaic process.
        /// </summary>
        /// <param name="src">The source image.</param>
        /// <param name="v">The threshould to control the result of mosaic process.</param>
        /// <returns></returns>
        public static WriteableBitmap MosaicProcess(WriteableBitmap src, int v)////图像马赛克效果
        {
            if (src != null)
            {
                int w = src.PixelWidth;
                int h = src.PixelHeight;
                WriteableBitmap srcImage = new WriteableBitmap(w, h);
                byte[] temp = src.PixelBuffer.ToArray();
                byte[] tempMask = (byte[])temp.Clone();
                int dR = 0;
                int dG = 0;
                int dB = 0;
                int dstX = 0;
                int dstY=0;
                dR = tempMask[2];
                dG = tempMask[1];
                dB = tempMask[0];
                for (int j = 0; j < h; j++)
                {
                    for (int i = 0; i < w; i++)
                    {
                        dstX = i;
                        dstY = j;
                        if (j % v == 0)
                        {
                            if (i % v == 0)
                            {
                                dB = tempMask[dstX * 4 + dstY * w * 4];
                                dG = tempMask[dstX * 4 + 1 + dstY * w * 4];
                                dR = tempMask[dstX * 4 + 2 + dstY * w * 4];
                            }
                            else
                            {
                                temp[dstX * 4 + dstY * w * 4] = (byte)dB;
                                temp[dstX * 4 + 1 + dstY * w * 4] = (byte)dG;
                                temp[dstX * 4 + 2 + dstY * w * 4] = (byte)dR;
                            }
                        }
                        else
                        {
                            temp[dstX * 4 + dstY * w * 4] = temp[dstX * 4 + (dstY - 1) * w * 4];
                            temp[dstX * 4 + 1 + dstY * w * 4] = temp[dstX * 4 + 1 + (dstY - 1) * w * 4];
                            temp[dstX * 4 + 2 + dstY * w * 4] = temp[dstX * 4 + 2 + (dstY - 1) * w * 4];
                        }
                    }
                }  
                Stream sTemp = srcImage.PixelBuffer.AsStream();
                sTemp.Seek(0, SeekOrigin.Begin);
                sTemp.Write(temp, 0, w * 4 * h);
                return srcImage;
            }
            else
            {
                return null;
            }
        }</strong>

[图像效果]




2019-04-13 19:54:27 Eastmount 阅读数 4949
  • 一小时快速学习屏幕录像和视频编辑实战教程

    本套课程全程采用实例演示,思路清晰,易学易操作。课程包括屏幕录像、视频编辑、视频压缩,一套完整的课程。屏幕录像部分教大家用简单实用的方法录制高清视频,视频编辑部分包括视频裁剪、分割、合并、字幕、水印、画中画、分屏、马赛克、绿幕抠像、变声变速、换音乐等等,视频压缩教大家如何压缩视频而且不影响视觉清晰度,压缩体积方便上传和下载。

    328 人正在学习 去看看 陈虎

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素
[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
[Python图像处理] 五.图像融合、加法运算及图像类型转换
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
[Python图像处理] 七.图像阈值化处理及算法对比
[Python图像处理] 八.图像腐蚀与图像膨胀
[Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算
[Python图像处理] 十.形态学之图像顶帽运算和黑帽运算
[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图
[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算
[Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理
[Python图像处理] 十五.图像的灰度线性变换
[Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换
[Python图像处理] 十七.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割

前面一篇文章我讲解了基于K-Means聚类的图像分割或量化处理,但突然发现市场上讲解图像量化和采样代码的文章很缺乏,因此结合2015年自己的一篇 文章 及相关知识,分享一篇Python图像量化及处理的博文供同学们学习。基础性文章,希望对你有所帮助。同时,该部分知识均为杨秀璋查阅资料撰写,转载请署名CSDN+杨秀璋及原地址出处,谢谢!!

1.图像量化处理(含原理、操作、聚类量化)
2.图像采样处理(含原理、操作、局部马赛克处理)

PS: 您可能发现作者最近写了很多Python图像处理的文章,新书即将出炉。fighting~


PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时参考如下文献:
eastmount - [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解(强推)
《数字图像处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
《数字图像处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
yunfung - 数字图像基础之图像取样和量化(Image Sampling and Quantization)
zqhwando - 图像处理中的采样与量化[EB/OL]
师寇_ - Python + opencv 实现图片马赛克


一.图像量化处理

图像通常是自然界景物的客观反映,并以照片形式或视频记录的介质连续保存,获取图像的目标是从感知的数据中产生数字图像,因此需要把连续的图像数据离散化,转换为数字化图像,其工作主要包括两方面——量化和采样。数字化幅度值称为量化,数字化坐标值称为采样。本章主要讲解图像量化和采样处理的概念,并通过Python和OpenCV实现这些功能。

1.1 概述

所谓量化(Quantization),就是将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量。图6-1是将图像的连续灰度值转换为0至255的灰度级的过程。

如果量化等级为2,则将使用两种灰度级表示原始图片的像素(0-255),灰度值小于128的取0,大于等于128的取128;如果量化等级为4,则将使用四种灰度级表示原始图片的像素,新图像将分层为四种颜色,0-64区间取0,64-128区间取64,128-192区间取128,192-255区间取192;依次类推。

图6-2是对比不同量化等级的“Lena”图。其中(a)的量化等级为256,(b)的量化等级为64,(c)的量化等级为16,(d)的量化等级为8,(e)的量化等级为4,(f)的量化等级为2。

1.2 操作

下面讲述Python图像量化处理相关代码操作。其核心流程是建立一张临时图片,接着循环遍历原始图像中所有像素点,判断每个像素点应该属于的量化等级,最后将临时图像显示。下述代码将灰度图像转换为两种量化等级。

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

#读取原始图像
img = cv2.imread('lena.png')

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

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

#图像量化操作 量化等级为2
for i in range(height):
    for j in range(width):
        for k in range(3): #对应BGR三分量
            if img[i, j][k] < 128:
                gray = 0
            else:
                gray = 128
            new_img[i, j][k] = np.uint8(gray)
        
#显示图像
cv2.imshow("src", img)
cv2.imshow("", new_img)

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

其输出结果如图6-3所示,它将灰度图像划分为两种量化等级。

下面的代码分别比较了量化等级为2、4、8的量化处理效果。

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

#读取原始图像
img = cv2.imread('lena.png')

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

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

#图像量化等级为2的量化处理
for i in range(height):
    for j in range(width):
        for k in range(3): #对应BGR三分量
            if img[i, j][k] < 128:
                gray = 0
            else:
                gray = 128
            new_img1[i, j][k] = np.uint8(gray)

#图像量化等级为4的量化处理
for i in range(height):
    for j in range(width):
        for k in range(3): #对应BGR三分量
            if img[i, j][k] < 64:
                gray = 0
            elif img[i, j][k] < 128:
                gray = 64
            elif img[i, j][k] < 192:
                gray = 128
            else:
                gray = 192
            new_img2[i, j][k] = np.uint8(gray)

#图像量化等级为8的量化处理
for i in range(height):
    for j in range(width):
        for k in range(3): #对应BGR三分量
            if img[i, j][k] < 32:
                gray = 0
            elif img[i, j][k] < 64:
                gray = 32
            elif img[i, j][k] < 96:
                gray = 64
            elif img[i, j][k] < 128:
                gray = 96
            elif img[i, j][k] < 160:
                gray = 128
            elif img[i, j][k] < 192:
                gray = 160
            elif img[i, j][k] < 224:
                gray = 192
            else:
                gray = 224
            new_img3[i, j][k] = np.uint8(gray)

#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']

#显示图像
titles = [u'(a) 原始图像', u'(b) 量化-L2', u'(c) 量化-L4', u'(d) 量化-L8']  
images = [img, new_img1, new_img2, new_img3]  
for i in xrange(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray'), 
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

输出结果如图6-4所示,该代码调用matplotlib.pyplot库绘制了四幅图像,其中(a)表示原始图像,(b)表示等级为2的量化处理,(c)表示等级为4的量化处理,(d)表示等级为8的量化处理。

1.3 K-Means聚类量化处理

上一小节的量化处理是通过遍历图像中的所有像素点,进行灰度图像的幅度值离散化处理。本小节补充一个基于K-Means聚类算法的量化处理过程,它能够将彩色图像RGB像素点进行颜色分割和颜色量化。更多知识推荐大家学习前一篇文章。

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

#读取原始图像
img = cv2.imread('people.png') 

#图像二维像素转换为一维
data = img.reshape((-1,3))
data = np.float32(data)

#定义中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +
            cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS

#K-Means聚类 聚集成4类
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)


#图像转换回uint8二维类型
centers = np.uint8(centers)
res = centers[labels.flatten()]
dst = res.reshape((img.shape))

#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)


#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']

#显示图像
titles = [u'原始图像', u'聚类量化 K=4']  
images = [img, dst]  
for i in xrange(2):  
   plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), 
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

输出结果如图6-4所示,它通过K-Means聚类算法将彩色人物图像的灰度聚集成四种颜色。

二.图像采样处理

2.1 概述

图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M×N个网格,每个网格用一个亮度值或灰度值来表示,其示意图如图6-5所示。

图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大。图6-6展示了不同采样间隔的“Lena”图。

2.2 操作

下面讲述Python图像采样处理相关代码操作。其核心流程是建立一张临时图片,设置需要采样的区域大小(如16×16),接着循环遍历原始图像中所有像素点,采样区域内的像素点赋值相同(如左上角像素点的灰度值),最终实现图像采样处理。代码是进行16×16采样的过程。

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

#读取原始图像
img = cv2.imread('scenery.png')

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

#采样转换成16*16区域
numHeight = height/16
numwidth = width/16

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

#图像循环采样16*16区域
for i in range(16):
    #获取Y坐标
    y = i*numHeight
    for j in range(16):
        #获取X坐标
        x = j*numwidth
        #获取填充颜色 左上角像素点
        b = img[y, x][0]
        g = img[y, x][1]
        r = img[y, x][2]
        
        #循环设置小区域采样
        for n in range(numHeight):
            for m in range(numwidth):
                new_img[y+n, x+m][0] = np.uint8(b)
                new_img[y+n, x+m][1] = np.uint8(g)
                new_img[y+n, x+m][2] = np.uint8(r)
        
#显示图像
cv2.imshow("src", img)
cv2.imshow("", new_img)

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

输出结果如下图所示:

同样,可以对彩色图像进行采样处理,下面的代码将彩色风景图像采样处理成8×8的马赛克区域。

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

#读取原始图像
img = cv2.imread('scenery.png')

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

#采样转换成8*8区域
numHeight = height/8
numwidth = width/8

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

#图像循环采样8*8区域
for i in range(8):
    #获取Y坐标
    y = i*numHeight
    for j in range(8):
        #获取X坐标
        x = j*numwidth
        #获取填充颜色 左上角像素点
        b = img[y, x][0]
        g = img[y, x][1]
        r = img[y, x][2]
        
        #循环设置小区域采样
        for n in range(numHeight):
            for m in range(numwidth):
                new_img[y+n, x+m][0] = np.uint8(b)
                new_img[y+n, x+m][1] = np.uint8(g)
                new_img[y+n, x+m][2] = np.uint8(r)
        
#显示图像
cv2.imshow("src", img)
cv2.imshow("Sampling", new_img)

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

其输出结果如图所示,它将彩色风景图像采样成8×8的区域。

但上述代码存在一个问题,当图像的长度和宽度不能被采样区域整除时,输出图像的最右边和最下边的区域没有被采样处理。这里推荐读者做个求余运算,将不能整除部门的区域也进行采样处理。

2.3 局部马赛克处理

前面讲述的代码是对整幅图像进行采样处理,那么如何对图像的局部区域进行马赛克处理呢?下面的代码就实现了该功能。当鼠标按下时,它能够给鼠标拖动的区域打上马赛克,并按下“s”键保存图像至本地。

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

#读取原始图像
im = cv2.imread('people.png', 1)

#设置鼠标左键开启
en = False

#鼠标事件
def draw(event, x, y, flags, param):
    global en
    #鼠标左键按下开启en值
    if event==cv2.EVENT_LBUTTONDOWN:
        en = True
    #鼠标左键按下并且移动
elif event==cv2.EVENT_MOUSEMOVE and
 flags==cv2.EVENT_LBUTTONDOWN:
        #调用函数打马赛克
        if en:
            drawMask(y,x)
        #鼠标左键弹起结束操作
        elif event==cv2.EVENT_LBUTTONUP:
            en = False
          
#图像局部采样操作         
def drawMask(x, y, size=10):
    #size*size采样处理
    m = x / size * size  
    n = y / size * size
    print m, n
    #10*10区域设置为同一像素值
    for i in range(size):
        for j in range(size):
            im[m+i][n+j] = im[m][n]

#打开对话框
cv2.namedWindow('image')

#调用draw函数设置鼠标操作
cv2.setMouseCallback('image', draw)

#循环处理
while(1):
    cv2.imshow('image', im)
    #按ESC键退出
    if cv2.waitKey(10)&0xFF==27:
        break
    #按s键保存图片
    elif cv2.waitKey(10)&0xFF==115:
        cv2.imwrite('sava.png', im)

#退出窗口
cv2.destroyAllWindows()

其输出结果如图所示,它将人物的脸部进行马赛克处理。


希望这篇基础性文章对您有所帮助,如果有错误或不足之处,请海涵!
最近继续备考博士,接下来还有两个学校,一方面耐心等待之前的结果;另一方面继续复习,周末女神陪着来书店看书,岁月静好,砥砺前行!在这期间,自己经历了很多酸甜苦辣的事情,希望陌生的你也学会享受生活,共勉。

(By:Eastmount 2019-04-13 周六夜8点写于贵阳·钟书阁 https://blog.csdn.net/Eastmount )

2018-11-21 09:07:15 qq_42957463 阅读数 3033
  • 一小时快速学习屏幕录像和视频编辑实战教程

    本套课程全程采用实例演示,思路清晰,易学易操作。课程包括屏幕录像、视频编辑、视频压缩,一套完整的课程。屏幕录像部分教大家用简单实用的方法录制高清视频,视频编辑部分包括视频裁剪、分割、合并、字幕、水印、画中画、分屏、马赛克、绿幕抠像、变声变速、换音乐等等,视频压缩教大家如何压缩视频而且不影响视觉清晰度,压缩体积方便上传和下载。

    328 人正在学习 去看看 陈虎

电子科技大学 格拉斯哥学院 2017级 郭嘉祺

新生研讨课上,曾院长生动形象的给我们介绍了图像处理的有关技术,无论是视频防抖技术,还有基于图像融合技术的照片处理,抑或是对马赛克进行还原,都给我留下了颇深的映像

问题背景和应用前景以及潜在问题

和克隆这个词一样,马赛克实际上是从英文音译过来的。这个单词原本是源自于古希腊的一种镶嵌技术,后来被用于“模糊图像技术”的称呼。马赛克实际上就是调低整体图像(图片或者是视频的局部)的分辨率来达到遮掩图像特殊部分的目的。通过近几年大数据收集以及机器学习技术的不断成熟,使得对马赛克或者照片中的特殊部分进行还原和抹除成为可能。也许随着这项技术的日趋成熟,或许以后马赛克将不在会成为阻碍人们认知和事实之间的那堵“无形的墙”,但随之而来的是一些伦理层面的问题,如果每个人都可以通过机器将打码后的图片或者是视频恢复,那么马赛克的保密效用和保护作用也将荡然无存,这无可置疑的会对未成年人的保护构成巨大威胁,同时在特定情况下也会对个人以及集体造成不必要的经济损失。

基本原理

正如事实所反映的,反马赛克技术远远没有达到所谓的成熟阶段,更别说民用化阶段。或许从技术角度来说有人觉得不难,因为马赛克确实是后期加上去的,并非原始拍摄所有。就像两个图层,去掉表层,底层便暴露无疑。实则不然,打个比方,将一张照片打印出来,然后用铅笔进行“打码”,这张照片确实是可以通过橡皮进行擦除的。但是一旦经过复印。那么你是无论如何也无法做到还原的,“码”已经俨然成为了图像的一部分,这也是为什么图像的复原永远是以机器学习以及大数据的获取为前提。总而言之,马赛克还原主要分为以下两种方法。

  1. 假设原始图像中,同一纹理会出现多次。

于是模糊的部分就用图像中清晰的部分来填补,或者将多个模糊的同一种纹理进行比较,构造出一个清晰的纹理来替代它们。

比如图片中有很多斑马,但其中一匹被打码了,于是去马赛克算法寻找这个图像中“最能匹配这个马赛克的”其它斑马的局部图像,然后用这个局部图像来填补那个马赛克。

  1. 在一个巨大的图库中寻找并组合出最能匹配马赛克的图案。

自然图像中出现的物品,通常是有可能在其它地方出现的可以运用图像数据库丰富的“经验”来进行“脑补”。我们也可以简单的将这种情况视作一种图像融合,以此调整不同画面的色饱和度,白平衡,色温,以消除融合后不同数据源带来的在画面上的痕迹。

比如一张风景图,很多时候游人的入镜是不可避免的,通过合理的图像融合,我们甚至可以做到人像的消除。

技术来自—电子科技大学曾兵教授

曾兵,1963年9月出生,83和86年于成都电讯工程学院获学士、硕士学位,91年9月于芬兰坦佩雷理工大学获博士学位。经过一年半的博士后研究(加拿大多伦多大学、蒙特利尔协和大学),于93年1月加入香港科技大学,历任电子及计算机工程系助理教授、副教授、教授。
曾教授多年来一直专注于图像与视频处理的基础与应用研究,是该领域的国际知名专家并担任多个著名国际会议和顶级国际期刊的技术/组织程序委员、副主编、编委等职务,主持多项香港重大科研项目,拥有中、美、欧、日、韩等专利8项。在国际会议和刊物上发表180余篇,论文被引用近3000次。三个代表成果如下:早期的一篇关于快速运动估计的论文被SCI它引超过650次(Goggle引用1600来次)

使用C#进行图像处理

阅读数 16758

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