前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理、示例、问题及问题的解决方案。

方法一

原理介绍:利用resize()将图片先缩小,再放大

代码示例:

import cv2
import numpy as npif __name__ =='__main__':img=cv2.imread('D:\\26059\\Desktop\\20220630_python_learning\\CSDN_opencv_learning\\4.jpg')print(img.shape)#打印图片长宽cv2.namedWindow("image",cv2.WINDOW_NORMAL)#自由改变显示框大小img2=cv2.resize(img,(49,35))img3=cv2.resize(img2,(490,350))cv2.imshow('image',img3)cv2.waitKey(0)cv2.destroyAllWindows()

效果展示:

问题分析:使图像变的模糊,并没有达到马赛克的真正效果

解决方案:如果是想对图片进行马赛克处理,不太建议这种方法

方法二

原理介绍:1.先使用resize()将图片缩小按照一定比例缩小,原图像素为490*350,如下图代码示例cv2.resize(img,(49,35))即是将图像缩小十倍。

2.接着使用repeat(),分别将图像的横轴和竖轴放大N倍,(图中为10倍)

代码示例:

import cv2
import numpy as npimg=cv2.imread('D:\\26059\\Desktop\\20220630_python_learning\\CSDN_opencv_learning\\7.png')
cv2.namedWindow("image",cv2.WINDOW_NORMAL)#自由改变显示框大小img2=cv2.resize(img,(49,35))
img3=np.repeat(img2,10,axis=0)
img4=np.repeat(img3,10,axis=1)cv2.imshow("image",img3)
cv2.imwrite("image.png",img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果展示:

问题分析:相较于方法一的图像简单模糊处理,方法二能够较好的实现图像的马赛克处理,在利用repeat()对图像进行横轴与数轴放大时,通过调整N的数值大小,也能够较好的实现马赛克程度的调整。

此方式的问题在于,无法确定像素的选取,即无法确定是对某一块像素颜色进行加权处理,还是随机选取,或者采用其他方式。

解决方法:针对上述的问题,我所想到的解决方法是先对整个图像进行遍历,选取出一定像素颜色范围,对该范围利用上述方法进行处理。

方法三

原理介绍:利用切片,每隔n个取一个像素点,剥离了图像的细节

代码示例:

import cv2
import numpy as npif __name__ =='__main__':img=cv2.imread('D:\\26059\\Desktop\\20220630_python_learning\\CSDN_opencv_learning\\4.jpg')print(img.shape)#打印图片长宽cv2.namedWindow("image",cv2.WINDOW_NORMAL)#自由改变显示框大小img2=img[::15,::15]cv2.imshow('image',img2)cv2.waitKey(0)cv2.destroyAllWindows()

效果展示:

问题分析:上述图像中,图一的n值取15,图二的n值取50,通过对比,可以很明显的发现,图二的信息缺失更多,通过改变N值,也能够很好的实现图像马赛克程度的变化。

此种方法的问题在于,每n个像素取一个限制了像素选取的自由度。

利用opencv实现图像马赛克处理的三种方法相关推荐

  1. OpenCV精进之路(零):访问图像中像素的三种方法

    访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...

  2. 图像灰度化的三种方法(matlab、C++、Python实现)

    灰度化处理就是将一幅色彩图像转化为灰度图像的过程.彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程.灰度值大的像素点比较亮(像素值最大为255,为 ...

  3. 【opencv学习笔记】第五篇:访问图像中像素的三种方式、ROI区域图像叠加和图像混合

    1. 访问图像中像素的三种方式 任何图像处理算法,都是从操作每个像素开始的.在OpenCV中,提供了三种访问每个像素的方法. 方法1:指针访问:C操作符[] 方法2:迭代器iterator 方法3:动 ...

  4. 利用opencv对图像进行长曝光

    利用opencv对图像进行长曝光 本文首发于公众号[Opencv视觉实践],翻译自光头哥哥的博客: [Long exposure with OpenCV and Python],仅做学习分享. 原文链 ...

  5. 【图像处理】——图像滤波(Python+opencv实现三种方法:均值滤波、中值滤波、高斯滤波等)

    目录 一.什么是滤波以及滤波的目的? 二.均值滤波(cv2.blur()) 1.原理 2.关键代码 3.封装代码 二.中值滤波(cv2.medianBlur()) 1.原理 2.关键代码 3.封装代码 ...

  6. android代码查找图像,Android平台上利用opencv进行图像的边沿检测

    原标题:Android平台上利用opencv进行图像的边沿检测 近开始接触opencv for Android,从网上down了图像的边沿检测的代码. 测试图片: 在Android2.3.1模拟器上跑 ...

  7. 【图像处理】——图像的灰度化处理(Python实现三种方法——最大值法、平均值法、加权均值法、gamma校正)

    目录 一.什么是图像的灰度化? 二.灰度化的几种方法(最大值法.平均值法.加权均值法.gamma校正) 1.直接调用函数:cv2.cvtColor() 图像颜色空间转换 2.最大值法 (1)概念 (2 ...

  8. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  9. LeetCode547. Friends Circles 利用union find | bfs | dfs三种方法解决

    问题来源 此题来源于LeetCode547. Friend Circles,主要运用了并查集(union find).广度优先遍历(bfs)和深度优先遍历(bfs)三种方法解决. 问题简述 给定一个N ...

最新文章

  1. 你哪来这么多事(三):学生信息删除
  2. 121. Best Time to Buy and Sell Stock
  3. 用例设计方法及其覆盖率
  4. Android Java虚拟机拦截技术分析
  5. .Net简单上传与下载
  6. python requirements.txt_python生成requirements.txt的两种方法
  7. 【poj2114】点分治(离线)
  8. ccmlt 2013 V2.0012
  9. js中判断对象数据类型的方法
  10. 使用Vue做评论+localStorage存储(js模块化)
  11. php实现手机号注册登录,thinkphp 手机号和用户名同时登录
  12. 用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示
  13. 【FeignClient报错】Cannot deserialize value of type``from Object value (token `JsonToken.START_OBJECT`)
  14. 用html编写古诗词欣赏,品析古诗词画面描写之技巧
  15. Android ViewHolder的理解
  16. 什么是zigbee?
  17. IDEA括起选中的选中的内容
  18. 【LeetCode】934. 最短的桥
  19. 制作PPT的基本技巧
  20. 介绍一款密码分析软件cap4

热门文章

  1. ExoPlayer源码浅析(转载)
  2. 使用pyinstaller打包django项目
  3. STM32F207 +RTOS+LWIP 调试ping 不通解决。
  4. HarmonyOS之AI能力·语音播报
  5. 三分钟安装并运行tomcat9
  6. 老男孩python作业_老男孩python学习第一天作业
  7. 51单片机计算器(源程序+流程图+答辩报告+综合设计)
  8. 使用计算机编程求解问题要经过,2017年江苏省计算机等级考试复习资料
  9. 计算机科学与教育学报,基于专业认证的计算机科学与技术专业持续改进研究-高等教育研究学报.PDF...
  10. docker-compose部署java前后端分离项目