一、比较不同位深度BMP文件

从网页上下载一张彩色图片,查看该图片信息,显示位深度24


通过电脑画图程序和PS软件,分别将该图片保存为 32位、16位彩色和256色、16色、单色的位图(BMP)文件。

得到以下图片


分别查看这些图片信息

首先是32位彩色图colorful_32c.bmp


信息显示图片大小为3MB,位图大小计算:1024×768×32/8/1024=3072KB=3145728字节,这是不包含文件头信息的大小。

使用UltraEdit打开图片,查看文件头信息:


16位彩色图colorful_16c.bmp


信息显示图片大小为1.5MB,位图大小计算:1024×768×16/8/1024=1536KB=1572864字节,这是不包含文件头信息的大小。

使用UltraEdit打开图片,查看文件头信息:


256色位图colorful_256.bmp


信息显示图片大小为769KB,位图大小计算:1024×768×8/8/1024=768KB=786432字节,这是不包含文件头信息的大小。

使用UltraEdit打开图片,查看文件头信息:


16色位图colorful_16.bmp


信息显示图片大小为384KB,位图大小计算:1024×768×4/8/1024=384KB=393216字节,这是不包含文件头信息的大小。

使用UltraEdit打开图片,查看文件头信息:


单色位图colorful_sanse.bmp


信息显示图片大小为96KB,位图大小计算:1024×768×1/8/1024=96KB=98304字节,这是不包含文件头信息的大小。

使用UltraEdit打开图片,查看文件头信息:


位图文件头分4部分,共14字节:


位图信息头共40字节:

二、用奇异只分解对图片进行降维处理

打开Anaconda中的Spyder

运行代码:

import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib as mpl
from pprint import pprintdef restore1(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量m = len(u)n = len(v[0])a = np.zeros((m, n))for k in range(K):uk = u[:, k].reshape(m, 1)vk = v[k].reshape(1, n)a += sigma[k] * np.dot(uk, vk)a[a < 0] = 0a[a > 255] = 255# a = a.clip(0, 255)return np.rint(a).astype('uint8')def restore2(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量m = len(u)n = len(v[0])a = np.zeros((m, n))for k in range(K+1):for i in range(m):a[i] += sigma[k] * u[i][k] * v[k]a[a < 0] = 0a[a > 255] = 255return np.rint(a).astype('uint8')if __name__ == "__main__":A = Image.open("E:\\tupian\\guoba.png", 'r')print(A)output_path = r'E:\\tupian\\SVD_Output'if not os.path.exists(output_path):os.mkdir(output_path)a = np.array(A)print(a.shape)K = 50u_r, sigma_r, v_r = np.linalg.svd(a[:, :, 0])u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1])u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2])plt.figure(figsize=(11, 9), facecolor='w')mpl.rcParams['font.sans-serif'] = ['simHei']mpl.rcParams['axes.unicode_minus'] = Falsefor k in range(1, K+1):print(k)R = restore1(sigma_r, u_r, v_r, k)G = restore1(sigma_g, u_g, v_g, k)B = restore1(sigma_b, u_b, v_b, k)I = np.stack((R, G, B), axis=2)Image.fromarray(I).save('%s\\svd_%d.png' % (output_path, k))if k <= 12:plt.subplot(3, 4, k)plt.imshow(I)plt.axis('off')plt.title('奇异值个数:%d' % k)plt.suptitle('SVD与图像分解', fontsize=20)plt.tight_layout()# plt.subplots_adjust(top=0.9)plt.show()

三、采用图像的开闭运算,检测出2个样本图像中硬币、细胞的个数

处理过程:读取图片–>转为灰度图片–>二值化–>腐蚀–>膨胀–>找中心点–>标识–>显示

代码:

import cv2
import numpy as npdef stackImages(scale, imgArray):"""将多张图像压入同一个窗口显示:param scale:float类型,输出图像显示百分比,控制缩放比例,0.5=图像分辨率缩小一半:param imgArray:元组嵌套列表,需要排列的图像矩阵:return:输出图像"""rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range(0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank] * rowshor_con = [imageBlank] * rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor = np.hstack(imgArray)ver = horreturn ver#读取图片
src = cv2.imread("C:/Users/28205/Documents/Tencent Files/2820535964/FileRecv/1.png")
img = src.copy()#灰度
img_1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#二值化
ret, img_2 = cv2.threshold(img_1, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)#腐蚀
kernel = np.ones((20, 20), int)
img_3 = cv2.erode(img_2, kernel, iterations=1)#膨胀
kernel = np.ones((3, 3), int)
img_4 = cv2.dilate(img_3, kernel, iterations=1)#找到硬币中心
contours, hierarchy = cv2.findContours(img_4, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2:]#标识硬币
cv2.drawContours(img, contours, -1, (0, 0, 255), 5)#显示图片
cv2.putText(img, "count:{}".format(len(contours)), (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(src, "src", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_1, "gray", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_2, "thresh", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_3, "erode", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_4, "dilate", (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
imgStack = stackImages(1, ([src, img_1, img_2], [img_3, img_4, img]))
cv2.imshow("imgStack", imgStack)
cv2.waitKey(0)


四、采用图像梯度、开闭、轮廓运算等,对图片中的条形码进行定位提取;再调用条码库获得条码字符

这里要用到imutils包和pyzbar包,打开Anaconda Prompt使用以下命令安装

pip install imutilspip install pyzbar

代码:

import cv2
import numpy as np
import imutils
from pyzbar import pyzbar
def stackImages(scale, imgArray):"""将多张图像压入同一个窗口显示:param scale:float类型,输出图像显示百分比,控制缩放比例,0.5=图像分辨率缩小一半:param imgArray:元组嵌套列表,需要排列的图像矩阵:return:输出图像"""rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range(0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank] * rowshor_con = [imageBlank] * rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor = np.hstack(imgArray)ver = horreturn ver#读取图片
src = cv2.imread("C:\\Users\\28205\\Documents\\Tencent Files\\2820535964\\FileRecv\\txm.jpg")
img = src.copy()#灰度
img_1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#高斯滤波
img_2 = cv2.GaussianBlur(img_1, (5, 5), 1)#Sobel算子
sobel_x = cv2.Sobel(img_2, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(img_2, cv2.CV_64F, 0, 1, ksize=3)
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)
img_3 = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)#均值方波
img_4 = cv2.blur(img_3, (5, 5))#二值化
ret, img_5 = cv2.threshold(img_4, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)#闭运算
kernel = np.ones((100, 100), int)
img_6 = cv2.morphologyEx(img_5, cv2.MORPH_CLOSE, kernel)#开运算
kernel = np.ones((200, 200), int)
img_7 = cv2.morphologyEx(img_6, cv2.MORPH_OPEN, kernel)#绘制条形码区域
contours = cv2.findContours(img_7, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)
c = sorted(contours, key = cv2.contourArea, reverse = True)[0]
rect = cv2.minAreaRect(c)
box = cv2.cv.BoxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img, [box], -1, (0,255,0), 20)#显示图片信息
cv2.putText(img, "results", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_1, "gray", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 3)
cv2.putText(img_2, "GaussianBlur",(200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 3)
cv2.putText(img_3, "Sobel", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_4, "blur", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_5, "threshold", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 3)
cv2.putText(img_6, "close", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 3)
cv2.putText(img_7, "open", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 3)#输出条形码
barcodes = pyzbar.decode(src)
for barcode in barcodes:barcodeData = barcode.data.decode("utf-8")cv2.putText(img, barcodeData, (200, 600), cv2.FONT_HERSHEY_SIMPLEX, 5.0, (0, 255, 0), 30)#显示所有图片
imgStack = stackImages(0.8, ([img_1, img_2],[img_3,img_4],[img_5,img_6],[img_7,img]))
cv2.imshow("imgStack", imgStack)
cv2.waitKey(0)

运行效果:

数字图像与机器视觉基础补充(1)相关推荐

  1. 数字图像与机器视觉基础补充(2)--颜色转换+分割车牌

    录 一.彩色图像文件转灰度文件 1.1 使用opencv 1.1.1 通过cvtColor库将其转为灰度 1.1.2 通过分离RGB三个通道得到三个通道的灰度图 1.2 不使用opencv 二.将彩色 ...

  2. 数字图像与机器视觉基础补充(1)——区分位图和图像处理

    目录 一.图片转化 (1)原图 (2)转换为位图 (3)压缩率 二.区分位图 (1)16/32位位图对照 (2)256/16/单色位图对照 三.图片处理编程 (一)奇异函数分解(SDV) (二)用图像 ...

  3. 数字图像与机器视觉基础补充(2)

    一.彩色图像文件转换为灰度文件 (一)使用opencv 1.通过cvtColor库将其转为灰度 (1)代码 import cv2 as cv img = cv.imread('C:/Users/861 ...

  4. 【计算机视觉】数字图像与机器视觉基础

    一.位图文件分析 1. 什么是位图 位图图像(bitmap),亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的.这些点可以进行不同的排列和染色以构成图样.当放大位图时,可以看见赖以构成 ...

  5. 数字图像与机器视觉基础(2)

    一.OpenCV+Python车牌字符分割 车牌号检测大致分为以下四个部分: 1.车辆图像获取 2.车牌定位 3.车牌字符分割 4.车牌字符识别 处理原理: 车牌定位需要用到的是图片二值化为黑白后进c ...

  6. 数字图像与机器视觉基础2

    一.使用和不使用opencv将彩色图像转化为灰度图像 具体步骤 1.灰度转换:将彩色图片转换为灰度图像,常见的R=G=B=像素平均值. 2.高斯平滑和中值滤波:去除噪声. 3.Sobel算子:提取图像 ...

  7. 【机器视觉】整合:机器视觉基础知识汇总

    本文系鼎酷IOT部落今日头条号原创,转载请注明出处. 到如今,中国已经成为世界机器视觉发展最为活跃地区,应用范围涵盖了工业.农业.医药.军事.航天.气象等国民经济各个行业.虽然机器视觉的成长速度非常快 ...

  8. 【机器视觉基础知识整理】

    机器视觉基础知识整理 本文记录一些比较有用的机器视觉硬件知识的文章链接,留以备用.会不定时更新补充,也欢迎大家下方评论补充,一起将有用的好文收集整理起来,用的时候也方便一些.(注:本文只附录文章链接, ...

  9. 机器视觉基础笔记01

    机器视觉基础笔记01 1. 什么是图像?怎么定义图像? 图像定义为二维函数 *f(x,y)*,其中*x,y*是空间坐标,*f(x,y)*是点 *(x,y)*的幅值.灰度图像是一个二维灰度(或亮度)函数 ...

最新文章

  1. python拟合求参_机器学习作业(四)神经网络参数的拟合——Python(numpy)实现
  2. 到成都去是联想的必然选择
  3. Ptyhon学习之元组
  4. python显示安装失败_关于python:安装失败并显示Requirements.txt,但可用于pip安装...
  5. 循环神经网络基础介绍
  6. SAP 电商云 Spartacus UI 同 SAP Customer Data Cloud 的集成
  7. 金士顿固态硬盘计算机如何识别,金士顿SV300 SF2281固态硬盘SSD不认盘开卡修复教程...
  8. moment.js 快捷查询
  9. node源码详解(五)
  10. mysql route mycat_mycat
  11. 在河北大学就读是怎样一种体验?
  12. 我的世界服务器启动端怎么制作教程,我的世界怎样制作和运行服务器 详细制作教程一览...
  13. 【Ubuntu^Java】Ubuntu下JDK环境变量的配置
  14. 小程序云开发表单提交并在页面中获取数据
  15. 帝国cms 自动生成html,帝国cms实现用户访问页面自动生成html的方法
  16. 支持flv视频播放的h5播放器-xgplayer
  17. C/C++:打印乘法口诀表
  18. 浅谈混频器之镜像频率
  19. 使用jQuery来锁定HTML表格中的首行和首列
  20. iOS开发笔记之九十四——Swift中的可选类型Optional

热门文章

  1. .icns 是什么 又是如何创建的?
  2. Kesci“魔镜杯”风控算法大赛复赛解决方案
  3. gitkraken7.5.5 krack
  4. 坚果J10S和当贝F5谁是LED投影仪榜首,看了这篇你全明白
  5. 对韦东山老师移植最新uboot的总结
  6. 《秘密》卷一:秘密-财富的秘密
  7. C语言:计算全班学生的总成绩、平均成绩和以及 140 分以下的人数。
  8. dedecms响应式汽车制造公司网站模板
  9. h5自动弹出ios键盘
  10. 了解4-20mA信号