【机器学习手册】【7】OPENCV稍微高级点操作
前言对比度,边沿检测等等直方图import numpy as npfrom sklearn import preprocessingfrom sklearn.preprocessing import Normalizerfrom sklearn.preprocessing import FunctionTransformerfrom sklearn.preprocessing import Bin
·
前言
对比度,边沿检测等等
直方图
import numpy as np
from sklearn import preprocessing
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import Binarizer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from fancyimpute import KNN
from sklearn.covariance import EllipticEnvelope
from sklearn.preprocessing import LabelBinarizer, MultiLabelBinarizer
from sklearn.feature_extraction import DictVectorizer
from sklearn.neighbors import KNeighborsClassifier
import cv2
from matplotlib import pyplot as plt
img1=cv2.imread("1.jpg",cv2.IMREAD_GRAYSCALE)
h,w=img1.shape[:2]
#直方图均衡化
img2=cv2.equalizeHist(img1)
#制作掩码
mask=np.zeros(img1.shape[:2],np.uint8)
mask[int( h/4 ) : int (3*h/4) , int(w/4) : int(3*w/4) ] = 255
#计算直方图
hist_full=cv2.calcHist(
[img1], #图像
[0], #通道
None, #无掩码
[256], #灰度级
[0,256], #像素的灰度范围
)
hist_mask=cv2.calcHist(
[img1], #图像
[0], #通道
mask, #有掩码
[256], #灰度级
[0,256], #像素的灰度范围
)
plt.subplot(2,2,1)
plt.imshow(img1)
plt.subplot(2,2,2)
plt.imshow(img2)
plt.subplot(2,2,3)
plt.imshow(mask)
plt.subplot(2,2,4)
plt.plot(hist_full)
plt.plot(hist_mask)
plt.show()
#cv2.imshow("1",img1)
#cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 红色的直方图是原图的,蓝色的直方图是直方图均衡化后的
彩色图像增强
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
#转换到YUV空间
img_yuv=cv2.cvtColor(img1,cv2.COLOR_BGR2YUV)
#YUV空间的图像直方图均衡化
#对Y通道的所有像素进行均衡化
img_yuv[:,:,0]=cv2.equalizeHist(img_yuv[:,:,0])
#转换回来
img2=cv2.cvtColor(img_yuv,cv2.COLOR_YUV2BGR)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 左图中吼姆上的横条被增强了
颜色分离
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
hsv=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)
low_blue=np.array([50,100,50])
upper_blue=np.array([130,255,255])
mask=cv2.inRange(hsv,low_blue,upper_blue)
masked_img=cv2.bitwise_and(img1,img1,mask=mask)
#转换回来
img2=cv2.cvtColor(masked_img,cv2.COLOR_HSV2BGR)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

移除背景
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
#到RGB空间
rgb=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
#准备grabCut的参数------------
#矩形做参数 x,y,w,h
rect=(1,1,w,h) #不能从0,0开始
mask=np.zeros((h,w),np.uint8)
#背景的临时数组
back=np.zeros((1,65),np.float64) #只能是(1,65)
#前景的临时数组
front=np.zeros((1,65),np.float64) #只能是(1,65)
print(mask)
print("---------------------------------------------------")
cv2.grabCut(
rgb, #RGB图像
mask, #掩码 —— 被结果放在掩码里
rect, #矩形
back, #背景
front, #前景
5, #迭代次数
cv2.GC_INIT_WITH_RECT #使用定义的矩形初始化
)
print(mask)
print("---------------------------------------------------")
mask2=np.where(
(mask==2) | (mask == 0), #条件——背景是0,2
0, #满足条件的设置为0
1 #不满足条件设置为1
).astype('uint8')
print(mask2.shape) #mask2是二维的
#掩码2与RGB图像乘,除去背景
img2=rgb * mask2[:,:,np.newaxis]
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
---------------------------------------------------
[[0 0 0 ... 0 0 0]
[0 2 2 ... 2 2 2]
[0 2 2 ... 2 2 2]
...
[0 2 2 ... 2 2 2]
[0 2 2 ... 2 2 2]
[0 2 2 ... 2 2 2]]
---------------------------------------------------
(1012, 518)

- grabCut效果不好啊。。。不能依靠一个函数就解决问题
自适应阈值化
img1=cv2.imread("1.jpg",cv2.IMREAD_GRAYSCALE)
h,w=img1.shape[:2]
img2=cv2.adaptiveThreshold(
img1, #灰度图像
250, #最大灰度值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, #自适应阈值算法
cv2.THRESH_BINARY, #二值化方法
331, #分成区域大小,必须取奇数
10 #阈值化后减去这个值,就是最终值
)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测
img1=cv2.imread("1.jpg",cv2.IMREAD_GRAYSCALE)
h,w=img1.shape[:2]
#灰度强度的中位值
median=np.median(img1)
#阈值
lower=int( max( 0, ( 1 - 0.33)* median ) )
upper=int( min( 255, ( 1 + 0.33)* median ) )
#Canny检测器
img2=cv2.Canny(img1,lower,upper)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 边缘检测的方法有Canny,Sobel,Laplacian,Scharr
角点检测
Harris角点检测器
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
#限定数值类型
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
#检测角点
detected=cv2.cornerHarris(
gray, #灰度图
2, #领域大小
3, #Sobel算子孔径大小
0.04 #
)
#归一化
norm=np.zeros((h,w),np.uint8)
x=cv2.normalize(detected,norm,0,255,cv2.NORM_MINMAX)
img2=img1.copy()
#角点画上红圈
for r in range(h):
for c in range(w):
if int(x[r,c]) > 70:
cv2.circle(img2,(c,r),5,(10,10,255))
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)