图片处理
图片的预处理在机器学习中是一个重要且有效的步骤,可以使图片转换成适应模型的格式,也可进行数据增强和数据归一化等。
本文将对常用的图片处理方法进行归纳。
OpenCV-Python方法
教程:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
opencv以BGR模式加载图片。
使用需 import cv2
读写展示图片
读本地图片
1 | cv2.imread(filepath,flags) |
写图片到本地
1 | cv2.imwrite(filepath,img) |
#展示窗体,窗口自适应图片的大小
cv2.imshow(windowName,img)
#参数一:窗体标题 参数二:图像
#等待键盘输入,否则窗体一闪而过
cv2.waitKey(0)
#销毁所有窗口
cv2.destroyAllWindows()
#可调整大小窗口
cv2.namedWindow(windowName,flag)
#如果我们想放大缩小窗口,必须单独用cv2.namedWindow(),并通过flag参数指定窗口模式为cv2.WINDOW_NORMAL,默认为cv2.WINDOW_AUTOSIZE.
flag:
窗口大小可以改变: cv2.WINDOW_NORMAL , cv2.WINDOW_GUI_NORMAL
窗口大小不可以改变: cv2.WINDOW_AUTOSIZE
窗口大小自适应比例: cv2.WINDOW_FREERATIO
窗口大小保持比例: cv2.WINDOW_KEEPRATIO
显示色彩变成暗色: cv2.WINDOW_GUI_EXPANDED
exp:
cv2.namedWindow(“lena”,0)
cv2.imshow(“lena”,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1 |
|
#画直线
cv2.line()
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img,背景图
pt1,直线起点坐标
pt2,直线终点坐标
color,当前绘画的颜色。如在BGR模式下,传递(255,0,0)表示蓝色画笔。灰度图下,只需要传递亮度值即可。
thickness,画笔的粗细,线宽。若是-1表示画封闭图像,如填充的圆。默认值是1.
#画圈
cv2.circle()
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
img,背景图
center,圆心
radius,半径
color,颜色
thickness,线粗细
#画矩形
cv2.rectangle()
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
1 |
|
import cv2
import numpy as np
#创建三通道黑色图片
img = np.zeros([w, h, 3], np.uint8)
#创建三通道白色图片
img = np.zeros([w, h, 3], np.uint8) + 255
#创建四通道黑色透明图片(需保存为png才能看到透明度)
img = np.zeros([w, h, 4], np.uint8)
#由于opencv 颜色通道顺序为BGR
蓝色通道为:img[:, :, 0]
绿色通道为:img[:, :, 1]
红色通道为:img[:, :, 2]
透明度通道为:img[:, :, 3]
1 | ### 颜色空间转换 |
image = cv2.imread(“1.png”)
#从BGR转到HSV颜色空间
image_hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
#从彩色图转灰度图
image_ = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#从BGR转到RGB颜色空间
image_hsv = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
1 | ### 图像去噪 |
#高斯滤波
cv2.GaussianBlur()
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
@param: src: nparray
input image.
@param: ksize: (int,int)
Gaussian kernel size. ksize.width and ksize.height can differ
but they both must be positive and odd.
Or, they can be zero’s and then they are computed from sigma* .
@param: sigmaX: float
Gaussian kernel standard deviation in X direction.
@param: sigmaY: float
Gaussian kernel standard deviation in Y direction;
if sigmaY is zero, it is set to be equal to sigmaX,
if both sigmas are zeros, they are computed from ksize.width and ksize.height.
To fully control the result,
it is recommended to specify all of ksize, sigmaX, and sigmaY.
#exp
#可以自己构建高斯核
cv2.getGaussianKernel()
#也可以直接做模糊
blur = cv2.GaussianBlur(img, (6, 6), 1, 0)
1 | ### 二值化 |
ret, binary = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY_INV)
1 | ## 形态学处理 |
import cv2
import numpy as np
img = cv2.imread(‘j.png’,0)
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
1 |
|
dilation = cv2.dilate(img,kernel,iterations=1)
1 | ### 开运算:先腐蚀后膨胀 |
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
1 | ### 闭运算:先膨胀后腐蚀 |
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
1 | ### 形态梯度:物体的轮廓 |
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
1 |
|
binary, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
1 | cv2.drawContours() |
#导入所需库文件
import cv2
import numpy as np
#加载原始RGB图像
img_rgb = cv2.imread(“photo.jpg”) #创建一个原始图像的灰度版本,所有操作在灰度版本中处理,然后在RGB图像中使用相同坐标还原
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
#加载将要搜索的图像模板
template = cv2.imread(‘face.jpg’,0)
#记录图像模板的尺寸
w, h = template.shape[::-1]
#使用matchTemplate对原始灰度图像和图像模板进行匹配
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
#设定阈值 threshold = 0.7
#res大于70%
loc = np.where( res >= threshold)
#使用灰度图像中的坐标对原始RGB图像进行标记
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (7,249,151), 2)
#显示图像
cv2.imshow(‘Detected’,img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
1 |
|
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(‘home.jpg’,0)
plt.hist(img.ravel(),256,[0,256])
plt.show()
```