实验目的

实验工具

实验内容

实验一

题目

算法概述

代码实现

实验效果

实验二

题目

算法概述

代码实现

实验效果


实验目的

  1. 了解图片切换以及应用实现
  2. 实现中值区分算法

实验工具

python 3.7.0  pycharm

实验内容

实验一

题目

实现一种视频切换,将一张图片慢慢覆盖另一张图片,并通过一个开放的圆圈慢慢显现。写出公式,并在两个图片中获得正确的像素点以实现这种功能,只需要写出红色通道的答案即可。

算法概述

假设两张图片分别为A、B,列与行大小分别为col,row,每一个像素点都是由24位组成的,所以可以得到图片中心点O的坐标为(row/2, col/2) 不考虑奇偶的关系,同时假设图上的任意一个点表示为S,坐标为[x,y]

  1. 将一个图片慢慢覆盖另外一张图片,其实也就是像素点的替换过程
  2. 而因为替换过程是一个慢慢放大的圆环,因为这是一个动态的过程。所以可以分为两个步份来实现
    1. 一个圆环:假设圆环的半径为l

      1. 一个圆环中点的元素的替代,实际上是通过计算图像上每一个点到O点的距离与l的比值大小关系,也就是(y-col/2)*(y-col/2) + (x-row/2)*(x-row/2) 与 l^2的关系
      2. 如果大于,则不进行替换操作。
      3. 如果小于等于,则进行对应通道的赋值操作,因为是24色,一般体现为RGB,所以如果都需要替换则直接整体赋值,而比如需要替换R通道则对列表中的[0]进行替换
    2. 慢慢放大:也就是意味着圆的半径l是在不断变大的。
      1. 可以根据要求产生递增序列,以这一个递增序列作为圆的半径变化,然后每一次只需要更新一个圆环(也就是以序列中相邻两个数字为半径构成的圆环)
  3. 所以公式如下:也就是距离公式
    1. 伪代码:
    for l in seqfor x in rowfor y in colif (y-col/2)*(y-col/2) + (x-row/2)*(x-row/2) <= l*lim[x][y].Red = im2[x][y].Red
    

代码实现

from PIL import Image
from numpy import array
import imageio
im = Image.open('诺贝尔.jpg')
im2 = Image.open('lena.jpg')
#利用numpy的array将图片转化为数组
matrix = array(im)
matrix2 = array(im2)
img = []
#对图片进行替换操作
for i in range(16):for j in range(408):for k in range(408):根据图片像素点到圆心的距离判断是否进行替换if (j-204)*(j-204)+(k-204)*(k-204) <= 400*i*i:matrix[j][k] = matrix2[j][k]#将数组重新转化为图片并存进img中im3 = Image.fromarray(matrix)img.append(im3)
gifs = []
#将图片转化为numpy数组类型后存进gifs中
for i in range(len(img)):gifs.append(array(img[i]))
#生成gif图片
imageio.mimsave("problem1.gif", gifs, "GIF",  duration=0.5)

实验效果

构成GIF图片的每一帧图片截图:


GIF图片见:https://share.weiyun.com/5vcS9Z2

实验二

题目

对于颜色查找表,在一幅图片上试试中值区分算法,简要解释该算法若用在一幅红苹果图像上,在红颜色中,为什么把更多的颜色等级放在那些需要24位彩色图像的地方。

算法概述

中值区分算法的实现步骤如下:

  1. 将图片中的矩阵读取出来记为M,将M作为一整个方块。同时创建一个副本为M’
  2. 将这一个方块M根据当前所选择的通道(有R、G、B三个通道),找出对应的通道的中位数:
    1. 将相应通道大于该值的放入S1方块中,
    2. 而小于该值的放入S2方块中
    3. 等于的则先临时存储起来,然后待全部分割完之后再填充进S1与S2中使得S1与S2大小一样。
  3. 经过以上步骤之后M便被分割为S1与S2这两个方块,接着对S1与S2以及后续的分割后的方块重复使用以上的步骤直到分割为256个方块。
  4. 计算每一个方块的颜色的平均值,作为改方块中颜色的替代颜色。也就是对M’中相应的区域的颜色替代为平均值。
  5. 同时这256种颜色也就构成了颜色查找表。而M’可以生成变换后的图像。

可以知道这一个划分的过程相当于一个递归过程,因为每一个切割后的区域还需要每个单独进行切割,可以知道第n层递归产生的块数为2n,所以切分为256块,需要进行8层递归实现。所以到达第八层递归就是递归的终止条件。

红色颜色更多的原因:

  1. 因为中值区分算法实际上是一种颜色量化算法,其试图选择一个颜色均衡的颜色表。而这个颜色表是根据划分的颜色块有关的
  2. 而颜色更为集中的区块,也就意味着这一种颜色在一个图像中占有的比例更高,所以就会有更多的块含有这一种颜色。换句话说,出现更频繁的颜色将得到优先处理。这种算法考虑到具体图象的色彩分布,所得到的图象显示层次感丰富,较为常用。
  3. 因此根据中值区分算法的实现原理可以知道红颜色在查找表中也会相应的更多。

代码实现

import numpy
from PIL import Image
from numpy import array
from numpy import mean
from numpy import zeros
from numpy import median
#颜色查找表
global palette
#颜色查找表当前的大小
global size
#图片像素的cpoy
global matrixcopypalette = []
size = 0class BaseColor:x = 0y = 0color = [0, 0, 0]def __init__(self, x, y, color):self.x = xself.y = yself.color = colordef main():global paletteglobal sizeglobal matrixcopyim = Image.open("redapple.jpg")matrix = array(im)matrix2 = []matrixcopy = matrixfor i in range(len(matrix)):for j in range(len(matrix[0])):matrix2.append(BaseColor(i, j, matrix[i][j]))slice(matrix2, 0)print(len(palette))im = Image.fromarray(matrixcopy)im.save("256.jpg")palette_matrix = array(zeros([256, 100, 3], numpy.uint8))for i in range(256):for j in range(100):palette_matrix[i][j] = palette[i]im2 = Image.fromarray(palette_matrix)im2.show()im2.save("palette.jpg")# 递归分割获取颜色查找表
def slice(slice_colors, depth):global paletteglobal sizeglobal matrixcopyif depth > 7:size = size + 1r, g, b = [], [], []for i in range(len(slice_colors)):r.append(slice_colors[i].color[0])g.append(slice_colors[i].color[1])b.append(slice_colors[i].color[2])mean_color = [mean(r, dtype=int), mean(g, dtype=int), mean(b, dtype=int)]for i in range(len(slice_colors)):matrixcopy[slice_colors[i].x][slice_colors[i].y] = mean_colorpalette.append(mean_color)returncurrentrgb = []for i in range(len(slice_colors)):currentrgb.append(slice_colors[i].color[depth%3])currentrgbmedian = median(currentrgb)zero, one = [], []wait_slice = []#根据颜色与中值颜色的大小比较#若颜色大于中值颜色,则插入one中,隐式序列号#若颜色小于中值颜色,则插入zero中#若颜色等于中值颜色,则插入临时数组之中以待后续操作for i in range(len(slice_colors)):if slice_colors[i].color[depth%3] > currentrgbmedian:one.append(slice_colors[i])elif slice_colors[i].color[depth%3] == currentrgbmedian:wait_slice.append(slice_colors[i])else:zero.append(slice_colors[i])#计算出每一个数组应有的大小num2 = int(len(slice_colors)/2)#将wait_slice中的数据分割出去,使得zero和one的大小一致for i in range(len(wait_slice)):if(len(one) < num2):one.append(wait_slice[i])else:zero.append(wait_slice[i])#递归slice(one, depth + 1)slice(zero, depth + 1)returnif __name__ == "__main__":main()

实验效果

原图片为:

变化后的256色图如下:

颜色查找表如下:

多媒体图像切换与中值区分法相关推荐

  1. 图像降噪算法——中值滤波/均值滤波/高斯滤波/双边滤波

    图像降噪算法--中值滤波/均值滤波/高斯滤波/双边滤波 图像降噪算法--中值滤波/均值滤波/高斯滤波/双边滤波 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--中值滤波/均值滤波/高 ...

  2. matlab中值滤波法算法,基于MATLAB中值滤波算法的优化与实现

    总第238期2014年第4期 舰 船 电 子 工 程 Ship Electronic Engineering Vol.34No.437 基于 MATLAB中值滤波算法的优化与实现* 赵建春 刘力源 ( ...

  3. C语言实现图像中值滤波与均值滤波

    中值滤波 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波容易去除孤立点,线的噪声同时保持图象的边缘,对椒盐噪声有较好的滤波效果:它能很好 ...

  4. 使用c语言实现图像中值滤波,图像处理之中值滤波介绍及C实现

    原标题:图像处理之中值滤波介绍及C实现 1.中值滤波概述 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. ...

  5. 图像处理技术之三:降噪处理(中值、均值、最大值、最小值滤波、图像噪声)

    图像噪声的成因分类与常见图像去噪算法简介 1.图像噪声的成因 图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质,这对后续图像的处理和图像视觉效应将产生不利影响.噪声种类很多,比如:电噪 ...

  6. OpenCV3学习(4.2)——图像常用滤波方法(方框、均值、高斯、中值、双边)

    滤波处理分为两大类:线性滤波和非线性滤波.OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法. 线性滤波: 1.方框滤波:模糊图像 2.均值滤波:模糊图像 3.高斯滤波:信号的平 ...

  7. 基于FPGA的图像中值滤波原理与实现

    图像中值滤波的FPGA实现 项目简述 中值滤波器原理 中值滤波器的实现 测试模块的代码 仿真结果 下板结果 总结 项目简述 中值滤波器在去除尖端噪声中非常重要,是信号处理中最长用到的滤波器.图像中的一 ...

  8. 【OpenCV 例程200篇】58. 非线性滤波—中值滤波

    [OpenCV 例程200篇]58. 非线性滤波-中值滤波 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像滤波是 ...

  9. 中值滤波matlab

    摘  要 中值滤波技术是一种在去除噪声的同时能较好保护图像边缘细节的非线性技术,在图像增强和恢复等领域中得到了广泛的应用.文章阐述了中值滤波的原理和特点,并使用软件工具MATLAB实现了图像的中值滤波 ...

最新文章

  1. STL---string
  2. java类初始化顺序_「漫画」Java中的父子类的执行顺序到底是怎么一回事?
  3. 计算机数学基础 课程定位图形,本科《计算机数学基础》(上)课程教学设计方案.doc...
  4. restful规范和APIView
  5. [转]Eclipse插件开发之基础篇(2) 第一个Eclipse插件
  6. Spring集成Memcached三种方式(一)
  7. mac mysql打不开闪一下_mac系统上 MySQL Workbench意外退出,再也打不开
  8. centos7.0上安装五笔输入法
  9. 车牌识别(基于模板匹配算法)
  10. java编程计算圆球的体积_已知圆球体积为4/3πr³,试编写一个程序,输入圆球半径,经过计算输出圆球的体积.用JAVA编写的...明天(3月11号)要用....
  11. 图片上传时,显示格式错误怎么办?
  12. 如何彻底禁用谷歌Chrome更新
  13. python实现pdf格式转换图片格式
  14. 中国数字经济投资态势分析及发展前景深度评估报告2022-2028年版
  15. 跨越“数字鸿沟”,日本老年智能化服务的解法
  16. 安卓逆向例子--某菠菜APP token pwd 参数
  17. Zynq-7000 - Which IBIS models should be used for Zynq-7000 devices?
  18. DSP(f2812/28335/28377/28388)TZ功能说明
  19. 量化交易 第二课 平台介绍
  20. 大数据开发的五个步骤

热门文章

  1. 时光机穿梭(管理修改)
  2. u8服务器ip地址在哪修改,u8服务器ip地址在哪修改
  3. 一生践行“心正则字正”
  4. linux之根文件系统
  5. Speedoffice (word)文档里面怎样自动生成目录
  6. Eclipse设置护眼背景调整字体
  7. python 宝典 笔记 第十二章 存储数据和对象 (各种对象转换成字符串)
  8. 如何使用QQ收集表收青年大学习?
  9. Nginx 301重定向域名
  10. 书论91 万经《分隶偶存》