05-图像的美化

一、彩色图片直方图

cv2.calcHist([image],[0],None,[256],[0.0,255.0])
该方法的所有参数都必须用中括号括起来!!!
参数一:传入的图片数据
参数二:用于计算直方图的通道,这里使用的是灰度直方图,所以就使用第一个通道,第一个通道下标是0
参数三:mask模板,这里没有用,所以给个None
参数四:直方图的横坐标尺度size,表明直方图分成多少份,或有多少个柱状;256表示0-255总共256个灰度值
参数五:直方图中各个像素的值0.0-255.0表明从0.0开始已知到255.0所以的像素都进行遍历,因为灰度值只能是0-255之内

cv2.minMaxLoc(hist)
计算当前hist这个直方图中的最小值、最大值、最小值对应的下标和最大值对应的下标

cv2.split(img)
图像分解,将彩色图片的RGB分解为R G B三个通道

import cv2
import numpy as np
def ImageHist(image,type):color = (255,255,255)#定义当前颜色为白色windowName = 'Gray'#定义一个windows窗体if type == 31:#蓝色直方图color = (255,0,0)windowName = 'B Hist'elif type == 32:#绿色直方图color = (0,255,0)windowName = 'G Hist'elif type == 33:#红色直方图color = (0,0,255)windowName = 'R Hist'hist = cv2.calcHist([image],[0],None,[256],[0.0,255.0])#计算直方图方法minV,maxV,minL,maxL = cv2.minMaxLoc(hist)#计算当前hist这个直方图中的最大值、最小值以及其分别对应的下标histImg = np.zeros([256,256,3],np.uint8)for h in range(256):intenNormal = int(hist[h]*256/maxV)#将所有的像素值归到0-256之间,将图片上的像素进行归一化操作cv2.line(histImg,(h,256),(h,256-intenNormal),color)cv2.imshow(windowName,histImg)return histImgimg = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
channels = cv2.split(img)# 图像分解,将RGB图片分解为R G B三个通道
for i in range(0,3):#遍历颜色通道0、1、2ImageHist(channels[i],31+i)
cv2.waitKey(0)

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

二、直方图均衡化

灰度图片的直方图均衡化

cv2.equalizeHist(gray)
灰度图的均衡化方法,只需要传入一个灰度图即可,其实针对的是一个颜色通道,若是彩色图片有三个颜色通道需要分三次进行均衡化

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/Aa.jpg',1)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将彩色图转换为灰度图
cv2.imshow('src',gray)
dst = cv2.equalizeHist(gray)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下(左原图,右均衡化图片):
在这里插入图片描述

彩色图片的直方图均衡化

cv2.split(img)
图像分解,将彩色图片的RGB分解为R G B三个通道

cv2.merge((bH,gH,rH))
将单一的颜色通道进行合成到一起

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/Aa.jpg',1)
cv2.imshow('src',img)
(b,g,r) = cv2.split(img)#通道分解
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH,gH,rH))# 通道合成
cv2.imshow('dst',result)
cv2.waitKey(0)

效果图如下(左原图,右均衡化图片):
在这里插入图片描述

YUV图像的直方图均衡化

yuv是一种类似rgb的颜色模型,起源于黑白和彩电的过渡时期。
其中Y代表亮度,uv组合起来可以表示色度。
yuv信息只有y的信息就足以显示黑白的图片,
yuv和YCbCr表示相同的东西,且Cb严格对应U,Cr严格对应V

cv2.split(imgYUV)
图像分解,将彩色图片的RGB分解为R G B三个通道

cv2.equalizeHist(channelYUV[0])
对第一个颜色通道拿出来进行均衡化

cv2.merge(channelYUV)
将单一的颜色通道进行合成到一起

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/Aa.jpg',1)
imgYUV = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)#将BGR彩色图片转换为YUV图片
cv2.imshow('src',img)
channelYUV = cv2.split(imgYUV)
channelYUV[0] = cv2.equalizeHist(channelYUV[0])
channels = cv2.merge(channelYUV)
result = cv2.cvtColor(channels,cv2.COLOR_YCrCb2BGR)#将YUV图片转换为BGR彩色图片
cv2.imshow('dst',result)
cv2.waitKey(0)

效果图如下(左原图,右均衡化图片):
在这里插入图片描述

三、图片修补

cv2.inpaint(img,paint,3,cv2.INPAINT_TELEA)
参数一:毁坏的图片
参数二:修复的内容部分,mask模板
参数三:修复图片的线条粗细值。由于毁坏图片的时候进行的三个像素格的毁坏,故这里修复的线条粗细值为3
参数四:图片修复类型

对一张图片进行毁坏,并保存,这里使用的是改变图片中某位置的像素值从而达到毁坏图片的目的

import cv2 
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
for i in range(200,300):#对图片进行画线进行毁坏img[i,200] = (255,255,255)img[i,200+1] = (255,255,255)img[i,200-1] = (255,255,255)
for i in range(150,250):#对图片进行画线进行毁坏img[250,i] = (255,255,255)img[250+1,i] = (255,255,255)img[250-1,i] = (255,255,255)cv2.imwrite('E:\Jupyter_workspace\study\data/damaged.jpg',img)#保存一下毁坏的图片
cv2.imshow('image',img)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述
对毁坏的图片进行制作修复模板mask来修复图片

import cv2 
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/damaged.jpg',1)#读取毁坏的图片信息
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
paint = np.zeros((height,width,1),np.uint8)for i in range(200,300):#填补的模板参数,也就是刚才所绘制的画线paint[i,200] = 255#为了使得线段更加paint[i,200+1] = 255paint[i,200-1] = 255
for i in range(150,250):paint[250,i] = 255paint[250+1,i] = 255paint[250-1,i] = 255
cv2.imshow('paint',paint)imgDst = cv2.inpaint(img,paint,3,cv2.INPAINT_TELEA)#定义目标图片,即修复之后的图片cv2.imshow('image',imgDst)
cv2.waitKey(0)

效果图如下(左毁坏图片,中修复模板mask掩模,右修复过后的图片):

在这里插入图片描述

四、灰度直方图源码

灰度直方图的本质:统计每个像素灰度值出现的概率0-255

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('E:\Jupyter_workspace\study/w1.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
count = np.zeros(256,np.float)
for i in range(0,height):for j in range(0,width):pixel = gray[i,j]index = int(pixel)count[index] = count[index]+1
for i in range(0,255):count[i] = count[i]/(height*width)
x = np.linspace(0,255,256)
y = count
plt.bar(x,y,0.9,alpha=1,color='r')
plt.show()
cv2.waitKey(0)

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

五、彩色直方图源码

彩色直方图的本质:分别统计每个颜色通道上的像素值出现的概率0-255

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('E:\Jupyter_workspace\study/w1.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]#对每个颜色通道上的像素值进行统计
count_b = np.zeros(256,np.float)
count_g = np.zeros(256,np.float)
count_r = np.zeros(256,np.float)for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]#图片的像素值信息读取到元组(b,g,r)中index_b = int(b)#将像素值转换为int类型便于统计index_g = int(g)index_r = int(r)count_b[index_b] = count_b[index_b]+1#实现blue这个颜色通道上的像素的统计count_g[index_g] = count_g[index_g]+1count_r[index_r] = count_r[index_r]+1
for i in range(0,256):#遍历每一个像素等级count_b[i] = count_b[i]/(height*width)#对像素值出现的个数进行归一化处理count_g[i] = count_g[i]/(height*width)count_r[i] = count_r[i]/(height*width)
x = np.linspace(0,255,256)#从0开始,到255结束,一共256个
y1 = count_b
plt.figure()
plt.bar(x,y1,0.9,alpha=1,color='b')#绘制blue颜色通道的柱状图
y2 = count_g
plt.figure()
plt.bar(x,y2,0.9,alpha=1,color='g')
y3 = count_r
plt.figure()
plt.bar(x,y3,0.9,alpha=1,color='r')
plt.show()
cv2.waitKey(0)

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

六、灰度直方图均衡化

本质:统计每个像素灰度 出现的概率 0-255
累计概率

灰度等级出现的概率累积概率
10.20.1
20.30.5=0.2+0.3
30.10.6=0.2+0.3+0.1

总共256个灰度等级,每个灰度等级都会有一个出现概率,也都会有一个累积概率

灰度等级(100),累积概率(0.5),100到这个新值之间的映射(2550.5),以后所有的100等级这个像素都使用2550.5进行替代,替代完成之后就是直方图的均衡化

import cv2
import numpy as np
import matplotlib.pyplot as plt
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)
cv2.imshow('gray',gray)
count = np.zeros(256,np.float)
for i in range(0,height):for j in range(0,width):pixel = gray[i,j]index = int(pixel)count[index] = count[index]+1
for i in range(0,255):count[i] = count[i]/(height*width)
#计算累计概率
sum1 = float(0)
for i in range(0,256):sum1 = sum1+count[i]count[i] = sum1
#print(count)
# 计算映射表
map1 = np.zeros(256,np.uint16)
for i in range(0,256):map1[i] = np.uint16(count[i]*255)
# 映射
for i in range(0,height):for j in range(0,width):pixel = gray[i,j]gray[i,j] = map1[pixel]
cv2.imshow('dst',gray)
cv2.waitKey(0)

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

七、彩色直方图均衡化

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',1)
cv2.imshow('src',img)imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]count_b = np.zeros(256,np.float)
count_g = np.zeros(256,np.float)
count_r = np.zeros(256,np.float)
for i in range(0,height):for j in range(0,width):(b,g,r) = img[i,j]index_b = int(b)index_g = int(g)index_r = int(r)count_b[index_b] = count_b[index_b]+1count_g[index_g] = count_g[index_g]+1count_r[index_r] = count_r[index_r]+1
for i in range(0,255):count_b[i] = count_b[i]/(height*width)count_g[i] = count_g[i]/(height*width)count_r[i] = count_r[i]/(height*width)
#计算累计概率
sum_b = float(0)
sum_g = float(0)
sum_r = float(0)
for i in range(0,256):sum_b = sum_b+count_b[i]sum_g = sum_g+count_g[i]sum_r = sum_r+count_r[i]count_b[i] = sum_bcount_g[i] = sum_gcount_r[i] = sum_r
#print(count)
# 计算映射表
map_b = np.zeros(256,np.uint16)
map_g = np.zeros(256,np.uint16)
map_r = np.zeros(256,np.uint16)
for i in range(0,256):map_b[i] = np.uint16(count_b[i]*255)map_g[i] = np.uint16(count_g[i]*255)map_r[i] = np.uint16(count_r[i]*255)
# 映射
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 = map_b[b]g = map_g[g]r = map_r[r]dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

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

八、亮度增强

实现思路:在原来的亮度基础上+40,从而达到亮度增强的效果

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]
cv2.imshow('src',img)
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]bb = int(b)+40gg = int(g)+40rr = int(r)+40if bb>255:bb = 255if gg>255:gg = 255if rr>255:rr = 255dst[i,j] = (bb,gg,rr)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述
当然也可以改变颜色通道乘以一个比例系数再加上一个常数的方法实现美白效果
例如:(b1.3)+10、(g1.2)+15、r不变

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]
cv2.imshow('src',img)
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]bb = int(b*1.3)+10gg = int(g*1.2)+15if bb>255:bb = 255if gg>255:gg = 255dst[i,j] = (bb,gg,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

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

九、磨皮美白

调用API双边滤波
双边滤波:高斯滤波核g+距离核r,进行加权算出一个共同的核p,并用当前的和乘以像素,与像素进行卷积,就可以得到一个新的像素,这个新的像素就是经过双边滤波后的像素

import cv2
img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',1)
cv2.imshow('src',img)
dst = cv2.bilateralFilter(img,15,35,35)
cv2.imshow('dst',dst)
cv2.waitKey(0)

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

十、高斯、均值滤波

滤波0的本质:矩阵对应点相乘并求和
在这里插入图片描述
右边是卷积核,为啥成1/16,是因为这个卷积元素之和为16,而且这个卷积核越中间值越大,越两边值越小

高斯滤波使用API的方式进行调用

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',1)
cv2.imshow('src',img)
dst = cv2.GaussianBlur(img,(5,5),1.5)
cv2.imshow('dst',dst)
cv2.waitKey(0)

效果图如下:
在这里插入图片描述
均值滤波使用源码方式进行调用(为了防止溢出,图像边缘并进行处理)
首先定义一个模板,比如66的模板,数据全为1,用这个全为1的模板数据 乘以 一个66矩阵中的所有的数据,乘完之后再除以36,这样便得到一个均值,把这个均值替换掉原来的像素值,则实现均值滤波效果

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8)
for i in range(3,height-3):for j in range(3,width-3):sum_b = int(0)sum_g = int(0)sum_r = int(0)for m in range(-3,3):#-3 -2 -1 0 1 2for n in range(-3,3):(b,g,r) = img[i+m,j+n]sum_b = sum_b+int(b)sum_g = sum_g+int(g)sum_r = sum_r+int(r)b = np.uint8(sum_b/36)g = np.uint8(sum_g/36)r = np.uint8(sum_r/36)dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

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

十一、中值滤波

算法思路:假如定义一个3*3的模板,这个模板中一共有9个像素,将这9个像素进行排序,排序之后选择中间的那个像素值去代替其他像素值

import cv2
import numpy as np
img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
cv2.imshow('src',img)
dst = np.zeros((height,width,3),np.uint8)
collect = np.zeros(9,np.uint8)
for i in range(1,height-1):for j in range(1,width-1):k = 0for m in range(-1,2):#-1 0 1for n in range(-1,2):gray = img[i+m,j+n]collect[k] = grayk = k+1for k in range(0,9):#冒泡排序,从前往后比较,每轮比较选出最大值放到最后面p1 = collect[k]for t in range(k+1,9):if p1<collect[t]:mid = collect[t]collect[t] = p1p1 = middst[i,j] = collect[4]#该值就是中间值,用中间值去代替所有的像素值
cv2.imshow('dst',dst)
cv2.waitKey(0)

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

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

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

相关文章

java 检查目录是否存在_如何检查Java目录是否存在?

java 检查目录是否存在We are using the File class that is an abstract representation of file and directory path. To check if a directory exists we have to follow a few steps: 我们正在使用File类 &#xff0c;它是文件和目录路径的抽象表示。 要检查目录是否存在&a…

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

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

MySQL 定时器EVENT学习

MySQL 定时器EVENT学习 MySQL从5.1开始支持event功能&#xff0c;类似oracle的job功能。有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能&#xff0c;不用像以前需要操作的支持了。如linux crontab功能 。 创建测试表CREATE TABLE t( v VARCHAR(100) NOT NULL…

如何利用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、读出…

php静态分析工具window,window_SpeedPHP框架核心调试工具,在日常的编程开发当中,开发 - phpStudy...

SpeedPHP框架核心调试工具在日常的编程开发当中&#xff0c;开发者经常会使用到对变量的调试&#xff0c;而sp框架提供的变量调试输出函数——dump正好满足了变量调试的需求。下面来介绍一下dump函数的使用方法。dump —— 变量格式化输出函数用法&#xff1a;dump($vars, $out…

python 温度转换程序_Python程序将米转换为码

python 温度转换程序There are many problems where we have to calculate the distance in yards at the end but initially, the measurements are given in meters. So for such type of problems, the solution is converting the initial parameters into yards and then …

Oracle转Sqlserver 记录

使用了微软的SSMA帮忙&#xff0c;但是目前只有表能帮忙转&#xff0c;其他的还是要手动改&#xff0c;- - oracle 可以这样查询AppServiceInfoaspdb &#xff0c;调用其他库的表。SQL是&#xff1a; aspdb.dob.AppServiceInfo si数据库需要和 aspdb ASPDB_Capacity 在siinf…

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

#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…

php调用shell脚本安全,从PHP调用的shell脚本问题

TLDR;我有一个shell脚本,从命令行运行时工作正常,但如果从PHP脚本中调用(通过Web访问)则不行.在这两种情况下,主叫用户都是www-data.线路失败是这样的&#xff1a;openssl genrsa -des3 -out certs/$PCODE.key -passout env:PASSPHRASE 2048为什么会这样&#xff1f;我该怎么调…

linux 运维基础问题_Linux基础能力问题和解答

linux 运维基础问题This section contains Aptitude Questions and Answers on Linux Basics. 本节包含有关Linux基础知识的 Aptitude问答。 1) There are the following statements that are given below, which of them are correct about Linux? Linux is system software…

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

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

两栏 三栏的css

三栏格局 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns"http://www.w3.org/1999/xhtml" xml:lang"zh" lang"zh"><head pro…

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

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