机器学习——基于OpenCV和Python的智能图像处理(一)

机器学习入门(二)特征工程——特征抽取 特征工程,是指用一系列工程化的方式从原始数据中筛选出更好的数据特征,以提升模型的训练效果。 阅读详情

智能图像处理入门



前言

随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了计算机视觉图像处理


一、Python与OpenCV配置安装

1、下载Anaconda3-5.1.0-Windows-x86_64.exe    下载对应 python3.6.3
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
2、下载opencv 3.4.1.15
https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/

3、代码运行环境:IDEA(按个人喜好)

二、图像处理基础

1.ROI区域

截取部分图像数据

img=cv2.imread('cat'.jpg)
cat=img[0:50,0:200]
cv_show('cat',cat)

截取前
在这里插入图片描述
截取后
在这里插入图片描述

颜色通道提取

b.g.r=cv2.split(img)
img=cv2.merge((b,g,r))
img.shape
(414,500,3)
#只保留R,显示为红色,其他类同
cur_img=img.copy()
cur_img[:,:,0]=0
cur_img[:,:,0]=0
cv_show('R',cur_img)
#只保留G,显示为绿色,其他类同
cur_img=img.copy()
cur_img[:,:,0]=0
cur_img[:,:,2]=0
cv_show('G',cur_img)
#只保留B,显示为蓝色,其他类同
cur_img=img.copy()
cur_img[:,:,1]=0
cur_img[:,:,2]=0
cv_show('B',cur_img)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.边界填充

代码如下(示例):

top_size, bottom_size,left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_ize,right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect10l = cv2.copy;MakeBorder(img, top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant - cv2.copyMakeBorder(img, top_size,bottom_size,left_size,right_size, cv2. EORDER_CONSTANT, value-0)

import matplotlib. pyplot as plt
plt. subplot(231),plt.imshow (img,'gray'), plt.title(”ORIGINAL')
plt.subplot (232),plt.imshow(replicate, 'gray'), plt.title (*’REPLICATE”)
plt.subplot (233),plt. imshow(reflect,'gray'), plt.title(’REFLECT’)
plt. subplot(234),plt.imshow(reflect10l, 'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'), plt.title(" WRAP)
plt.subplot(236),plt.imshow(constant,'gray'), plt.tit1e(' cONSTANT')

plt.show ()

BORDER_REPLICATE:复制法。也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制如:fedcbaabcdefghihgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcblabcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abedefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。

在这里插入图片描述


3.数值计算
4.图像阈值

ret, dst = cv2.threshol d(src, thresh, maxval, type)

  • src:输入图,只能输入单通道图像,通常来说为灰度图 dst:输出图
  • thresh:阈值
  • maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型:
      cv2.THRESH_BINARY;  cv2.THRESH_BINARY_INV;
       cv2.THRESH_ TRUNC;  cV2.HRESH_ TO2  cv2.THRESH_TOZERO_INV
  • cv2.THRESH_BINARY 超过阈值部分取maxval (最人值),否则取O.
  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转
  • cv2.THRESH_TRUNC大于阈值部分设为阈值,否则不变
  • cv2.THRESH_TOZERO大于阈值部分不改变,否则设为0
  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
ret,thresh1 = cv2.threshold(img_gray,127,255,cv2.THRESH_RTNARY)
#上一种类型的反转
ret,thresh2 = cv2.threshold(img_gray,127,255, cv尘THRESH BINARY INV)
#阈值
ret,thresh3 - ev2.t hreshold(img_gray,127,255,cV2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img_gray,127,255, cv2.THRESH_T0ZERO)
# 上一种的反转
ret,thresh5 = cv2.threshold(img_gray,127,255, cv2.THRESH_TOZERO_INV)

titles = [ ' original Image','BINARY*,'BINARY_INV','TRUNC', 'TOZERo','TOZERO_INV”']images = [img,thresh1, thresh2,thresh3, thresh4, thresh5]

for i in range(6) :
plt.subplot (2,3.i + 1), plt.imshow (images[i], 'gray')
plt.title(titles[i])
plt.xticks([). plt.yticks([])
plt.show (

值>127:亮色显示为白色;
值<127:暗色显示为黑色;
在这里插入图片描述

图像平滑滤波处理

在这里插入图片描述

1.图像平滑处理

原图像:椒盐噪音点很明显
在这里插入图片描述

#均值滤波
#简单的乎均卷积操作
blur = cv2.blur(img,(3,3))
cv2.imshow (' blur', blur)
cv2.waitKey (0)
cv2.destroyAllWindows ()

处理后:椒盐噪音点不怎么明显了
在这里插入图片描述

方框滤波
#基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3),normalize=True)
cv2.imshow ((' box', box)
cv2.waitKey (0)
cv2.destroyAllWindows ()
 
#方框滤波
#基本和均痘一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)
cv2.imshow (" box', box)
cv2.waitKey (0)
cv2.destroyAllWindows ()

处理结果:和均值滤波类似
在这里插入图片描述

#高斯滤波
#高斯模糊的卷积核里的数值是满足高斯分布,机当于更重视中间的
aussian = cv2. GaussianBlur(img,(5, 5), 1)
cv2. imshow(' aussian',aussian)
cv2. waitKey (0)
cv2. destroyAllWindows ()

![在这里插入图片描述](https://img-blog.csdnimg.cn/8f58ee4388f14604898afda62b50fef1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU2VyZW5kaXBpdHlf562x5qWg,size_6,color_FFFFFF,t_70,g_se,x_16

2.高斯与中值滤波
#中值滤波
#相当于用中值代替
median = cv2. medianBlur(img, 5) # 中值滤波
cv2. imshow(' median',median)
cv2. waitKey (0)
cv2. destroyAllWindows ()

在这里插入图片描述

#展示所有的
res = np. hstack ( (blur, aussian, median))
cv2. imshow(' median Vs average' ,res)
cv2. waitKey (0)
cv2. destroyAllWindows()

处理后:
在这里插入图片描述

图像形态学处理

1.腐蚀操作

处理前:
在这里插入图片描述

img = cv2. imread( dige. png' )
cv2. imshow(' img',img)
cv2. waitKey (0)
cv2. destroyAllWindows ()

在这里插入图片描述

#5*5的腐蚀程度远远高于3*3
kernel = np. ones( 5, 5), np. uint8)
#修改数据为2,处理后线条几乎消失了
erosion = cv2. erode (img, kernel, iterations = 2)
cv2. imshow('erosion',erosion)
cv2. waitKey (0)
cv2. destroyAl lWindows ()

在这里插入图片描述

pie = cv2. imread(' pie',png' )
cv2. imshow('pie',pie)
cv2. waitKey (0)
cv2. destroyAllWindows ()
kernel = np. ones ((30, 30), rp. uint8)
erosion 1 = cv2. erode (pie, kernel, iterations = 1)
erosion_ 2 = cv2. erode (pie, kernel, iterations = 2)
erosion_ 3 = cv2. erode (pie, kernel, iterations = 3)
res = np. hstack((erosion_ 1, erosion_ 2, erosion 3))
cv2. imshow(' res' ,res)
cv2. wai tKey (0)
cv2. destroyAllWindows( )

在这里插入图片描述

2.膨胀操作

处理前:
在这里插入图片描述

img = cv2. imread( dige. png' )
cv2. imshow('img',img)
cv2. waitKey (0)
cv2. destroyAllWindows ()

膨胀后:
在这里插入图片描述

kernel = np. ones((3, 3), np. uint8)
dige. erosion = cv2. erode (img, kernel, iterations = 1)
cv2. imshow('erosion',erosion)
cv2. waitKey (0) 
cv2. destroyAllWindows ()
kernel = np. ones((3, 3), np. uint8)
dige_ _dilate = cv2. dilate (dige_ erosion, kernel, iterations = 1)
cv2. imshow('dilate',dige_ dilate)
cv2. waitKey (0)
cv2. destroyAllWindows()
pie = cv2. imread('pie.png' )
kernel = np. ones ((30, 30),np. uint8)
dilate_ 1 = cv2. dilate (pie, kernel, iterations = 1)
dilate_ 2 = cv2. dilate (pie, kernel, iterations = 2)
dilate_ 3 = cv2. dilate (pie, kernel, iterations = 3)
res = np. hstack((dilate_ 1, dilate_ 2, dilate_ 3))
cv2. imshow('res',res)

膨胀后的结果:
在这里插入图片描述

3.开运算与闭运算
#开:先腐蚀,再膨胀
img = cv2. imread(' dige. png )
kernel = np. ones((5, 5),np. uint8)
opening = cv2. morphologyEx(img,cv2. MORPH 0OPEN, kernel)
cv2. imshow( opening',opening)
cv2. waitKey (0)
cv2. destroyAllWindows 0
#闭:先膨胀,再腐蚀
img = cv2. imread('dige. png' ) 
kernel = np. ones((5, 5), np. uint8)
closing = cv2. morphologyEx (img,cv2. MORPH CLOSE,kerne1)
cv2. imshow('closing',closing)
cv2. waitKey (0)
cv2. destroyAllWindows ()

4.梯度计算方法
#梯度=膨胀腐蚀
pie = cv2. imread('pie. png' ) 
kernel = np. ones((7, 7), np. uint8)
dilate = cv2. dilate(pie, kernel, iterations = 5)
erosion = cv2. erode (pie, kernel, iterations = 5)

res = np. hstack((di late, erosion))

cv2. imshow('res',res)
cv2. waitKey(0) 
cv2. destroyAllWindows()

在这里插入图片描述

gradient = cv2. morphologyEx(pie,cv2. MORPHL GRADIENT,kernel)
cv2. imshow('gradient',gradient)
cv2. waitKey (0)
cv2. destroyAllWindows()

在这里插入图片描述

5.黑帽与礼帽
  • 礼帽=原始输入-开运算结果
  • 黑帽=闭运算-原数输入

处理前:

#礼帽
img = cv2. imread('dige. png' )
tophat = cv2. morphologyEx (img,cv2.MORPH TOPHAT,kernel)
cv2. imshow(' tophat',tophat)
cv2. waitKey (0) 
cv2. destroyAllWindows ()

处理后:
在这里插入图片描述

#黑帽
img = cv2. imread('dige.png' )
blackhat = cv2. morphologyEx (img. cv2. MORPH BLACKHAT, kernel)
cv2. imshow(' blackhat',blackhat )
cv2. waitKey (0)
cv2. destroyAllWindows()

处理后:
在这里插入图片描述

图像梯度与边缘检测

1.Sobel算子

在这里插入图片描述

img = cv2.imread('pie. png', cv2.IMREAD_GRAYSCALE)
cv2.imshow("img ", img)
cv2.waitKey ()
cv2.destroyAllWindows ()

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

  • ddepth:图像的深度
  • dx和dy分别表示水平和竖直方向
  • ksize是Sobel算子的大小
def cv_show(img, name) :
cv2.imshow(name,img)
cv2.waitKey ()
cv2.destroyAllwindows()
sobelx = cv2.Sobel(img, cv2.CV_64F,1.0,ksize=3)
cv_show (sobelx,'sobelx')

结果:白-黑>0,显示 只有边界的位置有梯度
在这里插入图片描述

白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx - Cv2.convertScaleAbs(sobelx)
cv_show(sobelx, 'sobelx')

Gx计算执行之后的结果:
在这里插入图片描述

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertscaleAbs(sobely)

Gy计算执行完绝对值之后的结果:
在这里插入图片描述分别计算x和y,再求和

sobelxy = Cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

在这里插入图片描述
不建议直接计算

sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)sobelxy = cv2.convertscaleAbs(sobelxy)
cv_show(sobelxy,'sobelxy')

运行效果相对较差:
在这里插入图片描述原始图像:

img = cv2.imread(' lena.jpg',cv2.IMREAD_GRAYSCALE)
cv_show(sobelxy, 'sobelxy')

在这里插入图片描述

img = cv2.imread(' lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy, 'sobelxy')

分别计算X,分别计算Y,再一起计算XY,运行效果:
在这里插入图片描述

img = cv2. imread(' lena. jpg',cv2. IMREAD GRAYSCALE)
sobe. lxy=cv2. Sobel (img, cv2. CV_ 64F, 1, 1, ksize-3)
sobelxy = cv2. convertScaleAbs (sobelxy)
cv_ show (sobelxy,’sobelxy' )

在这里插入图片描述

总结:如上图所示,分别计算的运行效果图明显好于直接计算的效果图

2.梯度计算方法
3.Scharr与lapkacian
  • Scharr算子:更敏感描绘的更细致
    在这里插入图片描述
#不同算子的差异
img = cv2. imread('lena. jpg',cv2. IMREAD GRAYSCALE)
sobelx = cv2. Sobel(img, cv2. CV_ _64F, 1, 0, ksize-3)
sobely = cv2. Sobel (img, cv2. CV_ _64F, 0, 1, ksize-3)
sobelx = cv2. convertScaleAbs (sobelx)
sobely = cv2. convertScaleAbs (sobely)
sobelxy = cv2. addWeighted (sobelx, 0. 5, sobely,0.5, 0)
  • lapkacian算子
    在这里插入图片描述
scharrx = cv2. Scharr(img, cv2. CV_ _64F, 1, 0)
scharry = cv2. Scharr(img, cv2. CV_ 64F, 0, 1)
scharrx = cv2. convertScaleAbs (scharrx)
scharry = cv2. convertScaleAbs (scharry)
scharrxy = cv2. addWei ghted (scharrx, 0. 5, scharry,0. 5, 0) 
laplacian = cv2. Laplacian(img. cv2. CV_ 64F)
laplacian = cv2. convertScaleAbs (1aplacian)
res = np. hstack((sobelxy, scharrxy, laplacian))
cv_ show(res,' res' )

运行效果的差异:sobel、scharrx、laplacian
在这里插入图片描述

4. Canny边缘检测流程
  • 使用高斯滤波器,以平滑图像,滤除噪声。
  • 计算图像中每个像素点的梯度强度和方向。
  • 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
  • 应用双阈值(Double-Threshold) 检测来确定真实的和潜在的边缘。
  • 通过抑制孤立的弱边缘最终完成边缘检测。
    1、高斯滤波器

在这里插入图片描述
在这里插入图片描述
2、梯度和方向
在这里插入图片描述在这里插入图片描述

5.非极大值抑制

在这里插入图片描述

线性插值法:设g1的梯度幅值M(g1), g2的梯度幅值M(g2),则dtmp1可以很得到:
M(dtmp1)=w*M(g2)+(1-w)*M(g1)
其中w= distance(dtmp1,g2)/distance(g1,g2)
distance(g1,g2)表示两点之间的距离。
在这里插入图片描述
在这里插入图片描述

为了简化计算,由于一个像素周围有八个像素,把-个像素的梯度
方向离散为八个方向,这样就只需计算前后即可,不用插值了。

6.边缘检测
  • 双阈值检测
    在这里插入图片描述
    梯度值> maxVal:则处理为边界
    minVa|<梯度值< maxVal:连有边界则保留,否则舍弃
    梯度值<minVal:则舍弃
img=cv2. imread("lena.jpg ",cv2. IMREAD GRAYSCALE)
v1=cv2. Canny (img, 80, 150)
v2=cv2. Canny (img, 50, 100)
res = np. hstack((v1, v2))
CV_ show(res,
res' )

在这里插入图片描述
结论:左侧阈值为(80,150),右侧为(50,100)
阈值越小,得到的图像细节信息越多

img=cv2. imread('car. png',cv2. IMREAD_ GRAYSCALE)
v1=cv2. Canny (img, 120, 250)
v2-cv2. Canny (img, 50, 100)
res = np. hstack((v1, v2))
CV_ show(res,'res' )

在这里插入图片描述
结论:阈值越小,得到的图像细节信息越多,边界信息也越多

图像分割

1.金字塔定义

在这里插入图片描述

  • 高斯金字塔:向下采样方法(缩小)
    在这里插入图片描述

  • 高斯金字塔:向上采样法(放大)
    在这里插入图片描述

1.将图像在每个方向扩大为原来的两倍,新增的行和列以0填充
2.使用先前同样的内核(剩以4)与放大后的图像卷积,获得近似值

2.金字塔制作方法
ing=cv2. imread(" AM. png" )
cv_ show(img,'img')
print (img. shape)

(442,340, 3)

up=cv2. pyrUp (img)
cv_ show(up,'up' ) 
print up. shape

(884,680, 3)
变大效果图
在这里插入图片描述

down=cv2. pyrDown(img)
cv_ show (down,'down' )
print (down. shape)

(221,170, 3)
缩小效果图:
在这里插入图片描述

up2=cv2.pyrUp(up)
cv_ show(up2,'up2' )
print (up2. shape)

(1768,1360,3)

up=cv2. pyrUp (img)
up_ down=cv2. pyrDown (up)
cv_ show(img-up_ down,'img-up_ down' )

在这里插入图片描述
原始图像与上图的对比,原始图像更为清晰

CV_ show ( np. hstack((img, up_ down)),' up_ _down' )

在这里插入图片描述

结论:原始图像与上图的对比,原始图像更为清晰

  • 拉普拉斯金字塔
    在这里插入图片描述

1、低通滤波
2、缩小尺寸
3、放大尺寸
4、图像相减
在这里插入图片描述

轮廓检测

cv2.findContours(img,mode,method)

mode:轮廓检索模式
●RETR_ EXTERNAL :只检索最外面的轮廓; .
●RETR_ LIST: 检索所有的轮廓,并将其保存到一条链表当中;
●RETR_ CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
●RETR_ TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method:轮廓逼近方法
●CHAIN_ APPROX_ NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
●CHAIN_ APPROX_ SIMPLE:压缩水平的、 垂直的和斜的部分,也就是,函数只保留他们的终点部分。
在这里插入图片描述为了更高的准确率,使用二值图像。
原始图:
在这里插入图片描述
转化为灰度图,再转为二值图,目的是更好的进行目标检测

 img = cv2. imread('car. png' )
gray = cv2. cvtColor(img, cv2. COLOR BGR2GRAT)
ret,thresh = cv2. threshold(gray, 127, 255, cv2. THRESH BINARY)
cv_ show(thresh,' thresh' )

在这里插入图片描述

binary, contours, hierarchy = cv2. findContours (thresh, cv2. RETR_ TREE,cv2. CHAIN APPROX_ NONE)
1.绘制轮廓:
#传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
#注意需要copy,要不原图会变
draw_ img = img. copy()
res = cv2. drawContours (draw_ img, contours, -1, (O, 0,255), 2)
cv_ show(res,'res' )

在这里插入图片描述

draw_ img = img. copy()
res = cv2. drawContours (draw_ img, (contours,0,(0, 0,255), 2)
cv_show(res,'res' )
2.轮廓特征:
cnt = contours[0] I
#面积
cv2. contourArea (cnt)

8500.5

#周长,True表示闭合的
cv2. arcLength(cnt, True)
  1. 9482651948929
3.轮廓近似

在这里插入图片描述

img = cv2. imread(' contours2. prong’' )
gray = cv2. cvtColor(img,cv2. COLOR _BGR2GRAY)
ret,thresh = cv2. threshold(gray, 127, 255, cv2. THRESH_ BINARY)
binary, contours, hierarchy = cv2. findContours (thresh, cv2. RETR_ TREE,cv2. CHAIN _APPROX_ NONE)
cnt = contours [0]

draw_ img = img. copy()
res=cv2. drawContours(draw img, [cnt], -1, (0, 0, 255), 2) 
cv_ show(res,' res' )

在这里插入图片描述

epsilon = 0. 1*Cv2. arcLength (cnt, True)
approx = cv2. approxPolyDP (ent, epsilon, True)

draw_ img = img. copy()
res = cv2. drawContours (draw_ img, [approx], -1, (0, 0,255), 2)
cV_ show(res,'res' )

运行结果:近似后的结果(值越大,近似变化结果越大)
在这里插入图片描述

图像直方图处理

1.模板匹配方法
  • 模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv里有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)
    在这里插入图片描述
#模板四配
img = cv2. imread(' lena. jpg',0)
template = cv2. imread( face. jpg',0)
h, w =template. shape[:2]
img. shape

(263,263)

template. shape

(110,85)
●TM_ SQDIFF: 计算平方不同,计算出来的值越小,越相关
● TM_ CCORR:计算相关性,计算出来的值越大,越相关
●TM_ CCOEFF:计算相关系数,计算出来的值越大,越相关
●TM_ SQDIFF_ NORMED: 计算归一化平方不同,计算出来的值越接近0,越相关
TM_ CCORR NORMED:计算归-化相关性,计算出来的值越接近1,越相关
●TM_ CCOEFF_ NORMED:计算归-化相关系数,计算出来的值越接近1,越相关

2.匹配效果
  • 匹配单个对象
for meth in methods:
img2 = img. copy()

#匹配方法的真值
method = eval (meth)
print (method)
res = cv2. matchTemplate(img, template, method)
min_ val, max_ _val, min 1oc,max_ 1oc = cv2. minMaxLoc (res) 

#如果是平方差匹配TM SQDIFF或归-化平方差匹配TK SQDIFF NORMED,取最小值
if method in [cv2. TM SQDIFF, cv2. TM SQDIFF NORMED] :
top_ 1eft = min_ loc
else:
top_ 1eft = max_ 1oc
bottom right = (top_ 1eft[o] + w,top_ 1eft[1] + h)
#画矩形

cv2. rectangle(img2,top_ left, bottom_ right, 255, 2)
plt. subplot(121),plt. imshow(res,cmap=' gray' )
plt. xticks([]),plt. yticks([]) # 隐减坐标轴
plt. subplot(122),plt. inshow(img2,cmap-' gray' )
plt. xticks([]),plt. yticks([])
plt. suptitle (meth)
plt. show()

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 匹配多个对象
img_ rgb = cv2. imread( mario. jpg' )
ing_ gray = cv2. cvtColor(img_ rgb, cv2. COLOR BGR2GRAY)
template = cv2. imread(' mariopcoin. jpg',0)
h, w=template. shape[:2]

res = cv2. matchTemplate(img gray, template, cv2. TM_ CCOEFF NORMED)
threshold = 0. 8
#取匹配程度大于%80的坐标
1oc = np. where(res >= threshold)
for pt in zip(*loc[::-1]): # *号表示可选参数
    bottom_ right = (pt[0] + w,pt[1] + h)
    cv2. rectangle(img_ rgb, pt, bottom right, (0, 0, 255), 2)
    
cv2. imshow(' img. rgb' ,img. rgb)
cv2. waitKey (0)

原模板图像(小金币):
在这里插入图片描述

执行结果:
在这里插入图片描述

3.直方图定义

cv2.calcHist(images,channels,mask,histSize,ranges)
●images: 原图像图像格式为uint8或float32。当传入函数时应用中括号0括来例如[img]
●channels:同样用中括号括来它会告函数我们统幅图像的直方图。如果入图像是灰度图它的值就是[0]如果是彩色图像的传入的参数可以是[0][1][2]它们分别对应着BGR。
●mask:掩模图像。统整幅图像的直方图就把它为None。但是如果你想统图像某一分的直方图的你就制作一 个掩模图像并使用它。
●histSize:BIN 的数目。也应用中括号括来
, ranges:像素值范围常为[0256]

img = cv2. imread( cat. jpg' ,0) #0表示灰度图
hist = cv2. calcHist([img], [0], None, [256], [O, 256])
hist. shape

(256,1)

plt. hist (img. rave10, 256) ;
plt. show()

在这里插入图片描述

img = cv2. imread('cat. jpg' )
color-('b','g','r)
for i,col in enumerate (cqlor):
histr = cv2. calcHist ([img], [i], None, [256],[0, 256])
plt. plot (histr,color = col)
plt. xlim([0, 256])

在这里插入图片描述

#创建mast
mask = np. zeros (img. shape[:2],np. uint8)
mask[100:300,100:400] 一255
cv_ show(mask,' mask' )
img = cv2. imread(' cat. jpg',0)
cv_ show(img,' img' )
masked_ img = cv2. bitwise. _and(img,img, mask-mask) #与操作
cv_ show(masked_ img,' masked_ img' )
hist_ full = cv2. calcHist([img],[0], None, [256], [0, 256])
hist_ mask = cv2. calcHist([img],[0], mask, [256], [0,256])
plt. subplot (221),plt. imshow(img,' gray' )
plt. subplot (22),plt. imshow(mask,' gray' )
plt. subplot (223),plt. imshow (masked_ img,gray' ) 
plt. subplot (224),plt. plot (hist_ _full), plt. plot (hist_ mask)
plt. xlim([0, 256])
plt. show()

在这里插入图片描述

4.均衡化原理
5.均衡化效果
机器学习,图像的预处理 图像预处理,是将每一个文字图像分检出来交给识别模块识别,对图像进行预处理,让图像与电脑进行特定的符号化交流,进行格式之间的转换。 阅读详情

相关推荐

人工智能开发实战之OpenCV图像处理

OpenCV 是一款跨平台的计算机视觉和机器学习软件平台,在计算机视觉领域广泛使用,是目前人工智能应用中的重要基础平台。

sinat_30844883的博客 1144

图像特征提取(颜色,纹理,形状)

本文主要内容转载自博客:http://blog.youkuaiyun.com/abcjennifer/article/details/7424971                                        http://blog.youkuaiyun.com/abcjennifer/article/details/7425483

酒酿小圆子呀~ 8万+

Python与OpenCV图像处理详解:从基础到进阶!

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1291

用python进行图片处理和特征提取

原文来自:http://www.analyticsvidhya.com/blog/2015/01/basics-image-processing-feature-extraction-python/ 毫无疑问,上面的那副图画看起来像一幅电脑背景图片。这些都归功于我的妹妹,她能够将一些看上去奇怪的东西变得十分吸引眼球。然而,我们生活在数字图片的年代,我们也很少去想这些图片是在怎么存储在存储

擦玻璃的程序员专栏 4万+

OpenCV-Python实战(13)——OpenCV与机器学习的碰撞

机器学习是人工智能的子集,它为计算机以及其它具有计算能力的系统提供自动预测或决策的能力,诸如虚拟助理、车牌识别系统、智能推荐系统等机器学习应用程序给我们的日常生活带来了便捷的体验。机器学习的蓬勃发展,得益于以下三个关键因素:1) 海量数据集;2) 算法的快速发展;3) 计算机硬件的发展。在本文中,我们将学习 OpenCV 提供的常见机器学习算法和技术,用于解决计算机视觉项目中的实际问题,例如分类和回归问题。

盼小辉丶的博客 2万+

[Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍。该系列文章主要讲解Python OpenCV图像处理和图像识别知识,第一篇文章作为整个系列的引子,将介绍什么是图像处理,图像处理的基础知识,Python语言的优势和OpenCV基础概述。希望文章对您有所帮助,如果有不足之处,还请海涵。接下来,让我们开启整个系列的学习吧!

杨秀璋的专栏 8225

Python+OpenCV实用案例应用教程:使用图像描述符检索和搜索图像

类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据 库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。(想象一下把很多图片放到一起组成一幅360° 的全景图。) 本章将展示如何使用OpenCV检测图像中的特征,并利用这些特征 匹配和检索图像。在本章的学习过程中,我们会获取样本图像并检测 其主要特征,然后试着在另一幅图像中找到与样本图像匹配的区域。 我们还将找到样本图像和另一幅图像匹配区域之间的单应性或者

Lee达森的博客 2461

基于opencv和python的智能图像处理+源代码+文档说明

<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 -------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

OpenCV.ml 决策树训练 Vector too long 的问题

看 Machine Learning for OpenCV 4 second Edition, Aditya Sharma et al(中文名: 机器学习-使用OpenCV、Python和scikit-learn进行智能图像处理(原书第二版), 刘冰 译, 机械工业出版社) 5.2.1 P96 该章节是根据患者年龄、性别、血压、胆固醇浓度等因素(data)判断应当开什么药(target)的建立决策树的机器学习过程,代码在github是开源的,因此在这不加引用的给出: data = [ {'a

Yao_Shi_Fighting的博客 1949

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 271

【ANSYS Workbench仿真】命令流:压力渗透pressure penetration

对与流体接触的part添加边界压力,使流体压力渗透点的接触应力与流体压力相等,以便得到真实的变形结果,就需要用到“pressure penetration”。 但是在ansys中,只能通过ADPL的形式添加,即在workbench中添加命令流的形式。此文主要介绍了**压力渗透的添加要点**和**命令流使用说明**。

路边小M's Blog 1万+

Python图像处理:OpenCV入门教程

所谓图像处理指利用计算机技术对图像进行处理和增强的过程。它是计算机视觉的组成部分,可应用于多个领域。OpenCV是一种计算机视觉开源库。它由英特尔公司研发,可支持多种编程语言,如C++、Python 和 Java 等。主要用于开发实时的计算机视觉应用程序。它具有强大的图像处理功能,支持多种图像格式和数学运算,使开发人员可以很容易地使用和定制这个库。另外,它还具有良好的跨平台性能,能够在Windows、Linux 和 macOS 等多个操作系统上运行。人脸识别是一种基于图像和视频的自动识别技术。

BXA 9616

iSLIP算法实战:如何用Python模拟交换机优先级匹配(附完整代码)

本文详细介绍了如何使用Python实现iSLIP算法,模拟交换机优先级匹配过程。通过核心的指针滑动逻辑和迭代循环策略,构建了一个完整的iSLIP算法模拟器,并加入可视化模块以直观展示匹配过程。文章还提供了完整的代码框架和性能优化建议,适合网络工程师和Python开发者直接集成到测试环境中。

weixin_29313239的博客 249

【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能

在这篇文章中,我们从基础入门到实战应用,详细讲解了如何在 Python 中使用 OpenCV 进行图像处理和计算机视觉操作。我们通过实例演示了如何读取、显示、保存图像,并介绍了常用的几何变换、滤波与去噪技术。同时,我们深入探讨了边缘检测与特征提取等重要操作,帮助大家理解 OpenCV 在图像处理领域中的广泛应用。 OpenCV 不仅是图像处理的入门工具,也是掌握计算机视觉技术的基石。掌握这些基础知识和功能后,你将能够更灵活地应对各种图像处理需求,逐步迈向高级应用领域。

半截诗的博客~ 1万+

Unity手游优化实战:用GPU Instancing把草地渲染的DrawCall从8000降到20(附完整Shader)

本文详细介绍了Unity手游中利用GPU Instancing技术优化草地渲染的实战方法,将DrawCall从8000降至20。通过Shader改造和性能优化技巧,开发者可以在移动端实现高效渲染,显著提升游戏性能。文章包含完整的Shader代码和优化策略,适合Unity开发者学习应用。

weixin_33691817的博客 488

HyperMesh二次开发实战:自动化Comp与材料属性批量绑定

本文详细介绍了HyperMesh二次开发中自动化Comp与材料属性批量绑定的实战技巧。通过TCL脚本实现批量创建属性卡、智能材料分配和异常处理,大幅提升前处理效率,适用于汽车、航空航天等领域的复杂模型处理。

weixin_29214691的博客 688

OpenCV图像处理入门

OpenCV相关知识继续讲解

m0_37623374的博客 8606

告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)

本文详细介绍了如何使用ArcGIS和GTB进行生态源地MSPA分析的全流程,包括软件安装、数据预处理、参数设置、结果可视化和常见问题排查。特别针对ArcGIS和GTB组合使用时的常见问题提供了避坑指南,帮助研究者高效完成生态规划任务。

weixin_30756499的博客 433

使用opencv和python实现图像的智能处理_[套装书]机器学习:基于OpenCV和Python的智能图像处理+机器学习:使用OpenCV和Python进行智能图像处理(2册)...

---------------------------机器学习:基于OpenCV和Python的智能图像处理---------------------------前言第1章 智能图像处理入门 11.1 智能图像处理概述 11.2 环境搭建 21.2.1 安装Python 21.2.2 安装PyCharm 81.2.3 PyCharm的初始化 121.2.4 OpenCV及常用库的配置 ...

weixin_39955700的博客 925

手把手拆解UCIe协议层:从Raw Mode到Flit Mode,数据包到底经历了什么?

本文深入解析UCIe协议层的数据包处理机制,从Raw Mode到Flit Mode的三大变体(Standard 256B、68B-Enhanced、Latency-Optimized),详细揭示数据包在不同模式下的封装与转换过程。通过工程师视角,展示协议层如何实现多模式动态切换、错误恢复及与D2D Adapter的协同设计,为芯片级互连技术提供实践指导。

weixin_28728495的博客 238

基于YOLOv26的护栏损坏检测系统原理讲解

本文介绍了一种基于YOLOv26深度学习的护栏损坏检测系统。该系统通过车载摄像头或固定监控采集道路护栏图像,利用改进的YOLOv26算法实现高效准确的损坏检测。系统采用分层架构设计,包含数据采集、检测处理、分析评估和应用服务四个层次,能够自动识别变形、断裂、缺失等五种常见损坏类型,并评估损坏严重程度。相比传统人工检测方法,该系统大幅提高了检测效率和准确性,降低了人工成本和安全风险。关键技术包括多尺度特征融合、注意力机制和自适应非极大值抑制等创新设计,使系统在复杂道路环境下仍能保持稳定的检测性能。

一键难忘的博客 325

机器学习:基于OpenCV和Python的智能图像处理 实战

HSV色彩空间:HSV是从心理学角度提出的,它包括色调、饱和度和亮度三要素。其中,色调是指光的颜色,与混合光谱的主要光波长有关;饱和度是指颜色深浅程度或相对纯净度;亮度反映的是人眼感受到的光的明暗程度。YCrCb:Y代表亮度,Cr和Cb保存色度信息,其中Cr表示红色分量信息,Cb表示蓝色分量信息。平常大家看到的lena.png是这样的。图像通道的拆分和合并 RGB。示例图像 lena.png。逻辑运算:与或非、异或。

qq_40725313的博客 620

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

使用opencv和python实现图像的智能处理_机器学习:使用OpenCV和Python进行智能图像处理...

内容介绍 本书是一本基于OpenCV和Python的机器学习实战手册,既详细介绍机器学习及OpenCV相关的基础知识,又通过具体实例展示如何使用OpenCV和Python实现各种机器学习算法,并提供大量示列代码,可以帮助你掌握机器学习实用技巧,解决各种不同的机器学习和图像处理问题。 全书共12章,第1章简要介绍机器学习基础知识,并讲解如何安装OpenCV和Python工具;第2章展示经典的机器...

weixin_39609752的博客 692

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

机器学习:基于OpenCv和pthon的智能图像处理

机器学习:基于OpenCv和pthon的智能图像处理 chapter1图像基础知识 二值图像 ,指只含有黑色和白色的图像,白色的像素点处理为“1”,将黑色的像素点处理为“0”。 灰度图像 计算机会将灰度处理为256个灰度级,用数值区间[0,255]来表示。其中,数值“255”表示纯白色,数值“0”表示纯黑色,其余的数值表示从纯白到纯黑之间不同级别的灰度。 彩色图像 每个色彩通道值的范围都在[0,255]之间,在OpenCV中,通道的顺序是B→G→R。 读取图像 img=cv.imread(‘路径文件名.

weixin_44357194的博客 619

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

使用opencv和python进行智能图像处理 pdf电子_智能图像处理技术.pdf

学习openCV3(c ++)并使用python学习openCV替换的经典中外opencv作品: opencv官方中文教程,学习opencv第三版,opencv3 + python,opencv例程摘要,opencv示例和其他作品,适合新手入门和改进.立即下载与机器学习有关的信息,用于使用OpenCV和Python进行智能图像处理支持OpenCV和Python进行智能图像处理的机器学习代码和资源....

weixin_39871649的博客 797
上一篇: Android Studio 安装遇到问题及解决方法
下一篇: 如何将项目上传到Github上
Serendipity_筱楠
博客等级 码龄8年 2万+粉丝 272原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值