03-图像特效

一、灰度处理

方法一:imread方法

彩色图的颜色通道为3,即RGB;而灰度图只有一个颜色通道。

import cv2
img0 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)
img1 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
print(img0.shape)
print(img1.shape)cv2.imshow('src',img0)#灰度图片
cv2.waitKey(0)

结果如下:
灰度图像是没有颜色通道的,彩色照片的颜色通道为3

方法二:cvtColor方法

颜色空间转换
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
参数一:原始待转换数据图片
参数二:颜色转换方式,BGR转GRAY

import cv2
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#颜色空间转换
cv2.imshow('dst',dst)#灰度图片
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

方法三:灰度图像==彩色图像(R+G+B)/3

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度图像的GBR都相等,为彩色照片的均值
dst1 = np.zeros((height,width,3),np.uint8)for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]gray = (int(b)+int(g)+int(r))/3dst1[i,j] = np.uint8(gray)cv2.imshow('dst1',dst1)#灰度图片
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

方法四:灰度图像==彩色图像( R * 0.299+G * 0.587 + B * 0.114)

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度图像的GBR都相等,为彩色照片的均值
dst2 = np.zeros((height,width,3),np.uint8)for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]gray = (int(b)*0.114+int(g)*0.587+int(r)*0.299)dst2[i,j] = np.uint8(gray)cv2.imshow('dst2',dst2)#灰度图片
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

二、算法优化

1、定点计算比浮点计算快
2、加减运算比乘除运算快

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#灰度图像的GBR都相等,为彩色照片的均值
dst2 = np.zeros((height,width,3),np.uint8)for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]#gray = (int(b)*0.114+int(g)*0.587+int(r)*0.299)#gray = (int(b)+int(g)*2+int(r))/4#乘4除4gray = (r+(g<<1)+b)>>2#g乘2左移一位;除以4右移两位dst2[i,j] = np.uint8(gray)cv2.imshow('dst2',dst2)#灰度图片
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

三、颜色反转

灰度图像颜色反转:0-255,即:255-当前值

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度处理
dst = np.zeros((height,width,1),np.uint8)#这里只传入一个颜色通道(height,width,1)当成灰度图处理
for i in range(0,height):for j in range(0,width):grayPixel = gray[i,j]dst[i,j] = 255-grayPixelcv2.imshow('dst',dst)#灰度图片
cv2.waitKey(0)

效果图如下:
在这里插入图片描述
彩色图像的颜色反转:RGB每个颜色通道的像素值都需要被255减去

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)#(height,width,1)一个像素值有三个颜色通道组成
for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]dst[i,j] = (255-b,255-g,255-r)cv2.imshow('dst',dst)#灰度图片
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

四、图片的马赛克效果

马赛克效果:定义马赛克方块,例如为10*10;将马赛克方块中的一个像素值去替代整个马赛克方块中的所有像素点

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for i in range(100,300):for j in range(100,200):if i%10 ==0 and j%10==0 :#定义一个10*10的马赛克方块,用马赛克方块中的一个去代替整个马赛克的像素值for m in range(0,10):for n in range(0,10):(b,g,r) = img[i,j]img[m+i,n+j] = (b,g,r)cv2.imshow('dst',img)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

五、图片的毛玻璃效果

毛玻璃效果:定义毛玻璃方块,例如为10*10;随机生成一个像素点去依次代替毛玻璃方块中的所有像素点

import cv2
import numpy as np
import random
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
mm = 8
for m in range(0,height-mm):for n in range(0,width-mm):index = int(random.random()*8)#随机生成0-8这些数,去代替其他的像数值(b,g,r) = img[m+index,n+index]dst[m,n] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

六、图片的融合效果

采用每个图片乘以一个比例系数然后相加进行融合的方式;两张融合的图片的大小必须一致
cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
参数一:图片1
参数二:图片1对应的权值
参数三:图片2
参数四:图片2对应的权值
参数五:偏移量,一般默认设置为0

import cv2
import numpy as np
img0 = cv2.imread('E:\Jupyter_workspace\study\data/water.png',1)#这两张图片必须大于第一张图片的一半
img1 = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]
#ROI选取一块区域进行照片融合;且选取的大小必须比原图像要小
roiH = int(height/2)
roiW = int(width/2)
img0ROI = img0[0:roiH,0:roiW]
img1ROI = img1[0:roiH,0:roiW]
#dst 定义目标图片
dst = np.zeros((roiH,roiW,3),np.uint8)
dst = cv2.addWeighted(img0ROI,0.5,img1ROI,0.5,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

七、边缘检测

边缘检测的实质就是图像的卷积运算

调用Canny方法api实现边缘检测

canny边缘检测步骤:
1,对图像先进行灰度处理
2,高斯滤波,除去图像中一下噪声的干扰
3,调用canny方法实现边缘检测

cv2.Canny(img,50,50)
参数一:传入的图片数据
参数二:如果图片进行卷积运算之后大于该值,则认定为边缘

import cv2
import numpy as np
import randomimg = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('img',img)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#1,转换灰度图像
imgG = cv2.GaussianBlur(gray,(3,3),0)#2,高斯滤波
dst = cv2.Canny(img,50,50)#3,调用Canny算法
cv2.imshow('dsr',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述
在这里插入图片描述

使用sobel算子用源码方式实现边缘检测

soble算子的算法原理:
1,算子的模板
水平方向模板:
1 2 1
0 0 0
-1 -2 -1
竖直方向模板:
1 0 -1
2 0 -2
1 0 -1
2,图片卷积
矩阵卷积是矩阵对应的元素相乘然后再求和,并不是矩阵相乘!!!
例如:[1,2,3,4]为原像素,计算模板为[a,b,c,d],卷积之后结果为:dst = a1+b2+c3+d4
这个dst就是所谓的梯度,也分为水平方向gx和竖直方向gy
grad = sqrt(gxgx+gygy)
3,阈值判决
grad和阈值进行判断

import cv2
import numpy as np
import random
import math
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图
dst = np.zeros((height,width,1),np.uint8)#因为处理的是灰度图片所以参数为1
for i in range(0,height-2):#因为矩阵是3*3的,矩阵右下角坐标为2,所以要-2防溢出for j in range(0,width-2):gy = gray[i,j]*1 + gray[i,j+1]*2 + gray[i,j+2]*1 - gray[i+2,j]*1 - gray[i+2,j+1]*2 - gray[i+2,j+2]*1gx = gray[i,j]+gray[i+1,j]*2+gray[i+2,j]-gray[i,j+2]-gray[i+1,j+2]*2-gray[i+2,j+2]grad = math.sqrt(gx*gx+gy*gy)if grad>50:dst[i,j] = 255else:dst[i,j] = 0
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

八、图片的浮雕效果

前一个像数值-后一个像数值+一个恒定的常量

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图的转换
dst = np.zeros((height,width,1),np.uint8)
for i in range(0,height):for j in range(0,width-1):grayP0 = int(gray[i,j])#获取当前的灰度值grayP1 = int(gray[i,j+1])#因为宽度+1了,所以j需要减一,否则会造成数组越界newP = grayP0-grayP1+150if newP>255:newP=255if newP<0:newP=0dst[i,j] = newP
cv2.imshow('dst',dst)
cv2.waitKey(0)

在这里插入图片描述

九、颜色的映射变化改变图片的颜色风格

偏蓝风格:b1.5+g1.3

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]dst = np.zeros((height,width,3),np.uint8)
for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]b = b*1.5g = g*1.3if b>255:b=255if g>255:g=255dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

十、图片的油画效果

实现步骤:
1、实现彩色到灰色照片的转换
2、将图片分割为若干个小方块,统计这些小方块中的每个像素值
3、将0-255的灰度值划分为若干个等级,再把每个像素值映射到这些等级中
4、找到每个等级中含有像素最多的等级,并且求取这些像素的均值;从而实现每个小方块中像素个数的统计
5、用统计出来的平均值来替代原来的像素值,最终实现油画效果

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('img',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#完成灰度图像的转换
dst = np.zeros((height,width,3),np.uint8)#定义目标图片
for i in range(4,height-4):#因为下面的循环是定义的小方块大小为8*8for j in range(4,width-4):array1 = np.zeros(8,np.uint8)#定义的灰度等级为8个,这里定义一个数组装载这8个等级for m in range(-4,4):for n in range(-4,4): p1 = int(gray[i+m,j+n]/32)array1[p1] = array1[p1]+1currentMax = array1[0]l = 0for k in range(0,8):if currentMax<array1[k]:currentMax = array1[k]l = k# 简化 均值for m in range(-4,4):for n in range(-4,4):if gray[i+m,j+n]>=(l*32) and gray[i+m,j+n]<=((l+1)*32):(b,g,r) = img[i+m,j+n]dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析linux根文件系统的挂载过程

------------------------------------------ 本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------ 一&#xff1a;前言前段时间在编译kernel的时候发现rootfs挂载不上。相同的root选项设置旧版的image却可以。为了…

SIFT讲解(SIFT的特征点选取以及描述是重点)

目录SIFT是什么&#xff1f;尺度空间理论SIFT特征点提取SIFT特征点描述SIFT是什么&#xff1f; SIFT ,即尺度不变特征变换( Scale-invariant feature transform&#xff0c;SIFT) ,一种特征描述方法。具有 尺度鲁棒性 旋转鲁棒性 光照鲁棒性 SIFT本身包括了特征点筛选及特征点…

操作系统多线程实现_操作系统中的线程实现

操作系统多线程实现Each process has an address space. There is one thread of control in every traditional OS. Sometimes, it is viable to have multiple threads of control in the similar address space which is running in quasi-parallel. Though they were separ…

04-图像的形状绘制

一、线段绘制 cv2.line(dst,(100,100),(400,400),(0,0,255),2,cv2.LINE_AA) 参数一&#xff1a;目标图片数据 参数二&#xff1a;当前线段绘制的起始位置&#xff08;也就是两点确定一条直线&#xff09; 参数三&#xff1a;当前线段绘制的终止位置&#xff08;也就是两点确定…

(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程

问题出现&#xff1a;《数字信号处理第三版》第90页刘顺兰版 最后一步怎么得到的&#xff1f; 思路&#xff1a;观察答案&#xff0c;有一个自然对数项。关键就是如何提取出这一项。 我的证明过程如下&#xff1a; 参考链接&#xff1a; 【和差化积】

05-图像的美化

一、彩色图片直方图 cv2.calcHist([image],[0],None,[256],[0.0,255.0]) 该方法的所有参数都必须用中括号括起来&#xff01;&#xff01;&#xff01; 参数一&#xff1a;传入的图片数据 参数二&#xff1a;用于计算直方图的通道&#xff0c;这里使用的是灰度直方图&#xff…

Eclipse for android 中设置java和xml代码提示功能(转)

1、设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java &#xff0c;设置框中默认是一个点&#xff0c; 现在将它改为&#xff1a; 以下为引用内容&#xff1a; .a…

如何利用FFT(基2时间以及基2频率)信号流图求序列的DFT

直接用两个例子作为模板说明&#xff1a; 利用基2时间抽取的FFT流图计算序列的DFT 1、按照序列x[k]序号的偶奇分解为x[k]和x2[k]&#xff0c;即x1[k]{1,1,2,1}, x2[k]{-1,-1,1,2} 2、画出信号流图并同时进行计算 计算的时候需要参考基本蝶形单元&#xff1a; 关键在于 (WN) k…

matlab4.0,matlab 4.0

4.1fort-9:0.5:9if(t>0)y-(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);elsey(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);endend编译结果&#xff1a;y248.00t-9.00y221.75t-8.50y197.00t-8.00y173.75t-7.50y152.00t-7.00y131.75t-6.50y113.00t-6.00y95.75t-5.50y80.00t-5.00y65.75t-4.50y…

图形学 射线相交算法_计算机图形学中的阴极射线管

图形学 射线相交算法阴极射线管 (Cathode Ray Tube) Ferdinand Barun of Strasbourg developed the cathode ray tube in the year 1897. It used as an oscilloscope to view and measure some electrical signals. But several other technologies exist and solid state mov…

Constructor总结

一个类如果没有构造那么系统为我们在背后创建一个0参数的构造&#xff0c;但是一旦我们创建了但参数的构造&#xff0c;那么默认的构造就没了。 View Code 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace Console…

Python连接MySQL及一系列相关操作

一、首先需要安装包pymysql(python3所对应) 我使用的是Anaconda全家桶&#xff0c;打开cmd&#xff0c;进入Anaconda下的Scripts文件夹下输入命令&#xff1a;pip install pymysql进行下载安装 二、我使用的编译器为Anaconda所带的Jupyter Notebook 1&#xff0c;在mysql中…

微机原理—可编程计数器/定时器8253概念详解

目录前言【1】定时处理方法1、定时的方法&#xff1a;2、定时和计数器【2】8253计数/定时器1、特点&#xff1a;2、芯片引脚以及电路&#xff1a;3、连接方式&#xff1a;4、工作原理&#xff1a;5、寄存器配置a、初始化操作&#xff08;三个通道单独初始化&#xff09;b、读出…

形参与实参在函数中的传递

#include <iostream> #include <cstring> using namespace std; void myFun(int a[]); int main() {int a[10];cout<<"aaa"<<sizeof(a)<<endl;//40 int为4&#xff0c;a为10个int&#xff0c;故为40cout<<"yy"<<…

带你走进缓存世界

我们搞程序的多多少少都了解点算法。总体来讲&#xff0c;算法是什么&#xff1f;算法就是“时间”和“空间”的互换策略。我们常常考究一个算法的时间复杂度或空间复杂度&#xff0c;如果我们有绝对足够的时间或空间&#xff0c;那么算法就不需要了&#xff0c;可惜这种条件是…

霍夫码编码(一种不等长,非前缀编码方式)

霍夫曼编码是一种不等长非前缀编码方式&#xff0c;于1951年由MIT的霍夫曼提出。 用于对一串数字/符号编码获取最短的结果&#xff0c;获取最大的压缩效率。 特点&#xff1a;不等长、非前缀 等长式编码 等长编码&#xff0c;意思是对出现的元素采用相同位数的序号进行标定&a…

JS 获取浏览器信息,给出友情提示,避免部分兼容性问题

最近在做webform,浏览器兼容是个问题,这里我收集了一些获取浏览器信息的资料,可以给一些用户使用时,提示浏览器版本过低,让升级版本用. 这样会给开发的我们,省下很多用来调试兼容性的时间和精力. 本人就是这样想的 ~  检测浏览器及版本使用 JavaScript 检测关于访问者的浏览器…

06-机器学习(Haar+Adaboost实现人脸、人眼检测)

机器学习是什么? 机器学习训练样本特征分类器&#xff0c;通过让机器学习的方式&#xff0c;来达到某种功能的过程 深度学习是什么&#xff1f; 深度学习海量的学习样本人工神经网络 机器学习需要&#xff1a;样本、特征、分类器、对训练后的数据进行预测或检验 人脸样本haar…

Opencv实战【3】——图像修复与图像锐化(darling in the franxx)

目录前言图像修复图像锐化darling in the franxx图片总结前言 前天&#xff0c;在群里看见有人发了这张表情包&#xff1a; 感觉女主有点好看&#xff0c;然后问室友是啥番剧&#xff08;darling in the franxx&#xff09;&#xff0c;然后就去补番了&#xff0c;然后从晚上…

07-机器学习(Hog+SVM实现小狮子识别)

一、SVM支持向量机 什么是SVM支持向量机&#xff1f; SVM支持向量机本质仍是一个分类器&#xff0c;其核心为寻求一个最优超平面最终实现分类&#xff0c;实现分类问题 在寻求超平面的时候有多种方式&#xff0c;可以使用若干条直线或曲线进行分类&#xff0c;这里使用的是直线…