使用opencv的图像算法记录
1.从视频中抽帧
def get_frame_fromfile(file,frame):
cap=cv2.VideoCapture(file)
print(cap.get(0))#当前帧
print(cap.get(7))#总帧数
cap.set(cv2.CAP_PROP_POS_FRAMES,frame)
success,data=cap.read()
if success:
return data
capture.get(0) 视频文件的当前位置(播放)以毫秒为单位
capture.get(1) 基于以0开始的被捕获或解码的帧索引
capture.get(2) 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
capture.get(3) 在视频流的帧的宽度
capture.get(4) 在视频流的帧的高度
capture.get(5) 帧速率
capture.get(6) 编解码的4字-字符代码
capture.get(7) 视频文件中的帧数
capture.get(8) 返回对象的格式
capture.get(9) 返回后端特定的值,该值指示当前捕获模式
capture.get(10) 图像的亮度(仅适用于照相机)
capture.get(11) 图像的对比度(仅适用于照相机)
capture.get(12) 图像的饱和度(仅适用于照相机)
capture.get(13) 色调图像(仅适用于照相机)
capture.get(14) 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
capture.get(15) 曝光(仅适用于照相机)
capture.get(16) 指示是否应将图像转换为RGB布尔标志
capture.get(17) × 暂时不支持
capture.get(18) 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
该部分参考:https://blog.csdn.net/u011436429/article/details/80604590
2.灰度化图像
def turn_gray(image):
image_high=image.shape[0]
image_width=image.shape[1]
temp = np.arange(0, image.size/image.shape[2], 1)
temp = temp.reshape(image_high, image_width)
for i in range(image_high):
for j in range(image_width):
temp[i][j]=image[i][j][0]
return temp
3.绘制灰度图
def show_image(test_image):
image = PIL.Image.fromarray(test_image).convert("L")
plt.imshow(image, cmap=plt.cm.hot)
plt.colorbar(cax=None, ax=None, shrink=0.5)
plt.show()
其中绘图颜色由以下代码修改
plt.imshow(image, cmap=plt.cm.hot)
hot可以修改为其他参数,具体如下。参考自:matplotlib官方文档
4.一种基于均值滤波的滤波算法
def noise_reduction(image):
image_new=image
for i in range(30):
for j in range(30):
averange=(image[i][j]+image[i][j+2]+image[i+2][j]+image[i+1][j]+image[i][j+1]+image[i+1][j+1]+image[i+2][j+2]+image[i+2][j+1]+image[i+1][j+2])/9
if (averange>np.average(image)+150):#阈值1
image_new[i+1][j+1]=255
if (averange>image[i+1][j+1]+150):#阈值2
image_new[i + 1][j + 1] = 255
return image_new
后续可能会补充解释,主要是计算3X3格子内中间像素值与周围像素均值和整个图像像素君主的差异,根据差异大小判断是否是噪声需要去除,=255即为二值化去除噪声。
5.计算信息熵
def entropy(image):
tmp = []
for i in range(256):
tmp.append(0)
val = 0
k = 0
res = 0
img = np.array(image)
for i in range(len(img)):
for j in range(len(img[i])):
val = img[i][j]
tmp[val] = float(tmp[val] + 1)
k = float(k + 1)
for i in range(len(tmp)):
tmp[i] = float(tmp[i] / k)
for i in range(len(tmp)):
if (tmp[i] == 0):
res = res
else:
res = float(res - tmp[i] * (math.log(tmp[i]) / math.log(2.0)))
return res