目录

  • 一、图片转化
    • (1)原图
    • (2)转换为位图
    • (3)压缩率
  • 二、区分位图
    • (1)16/32位位图对照
    • (2)256/16/单色位图对照
  • 三、图片处理编程
    • (一)奇异函数分解(SDV)
    • (二)用图像的开闭运算(腐蚀-膨胀),检测出2个样本图像中硬币、细胞的个数
  • 四、图片条形码定位
  • 五、总结
  • 六、参考链接

一、图片转化

(1)原图

1.原图 sky.jpeg(2240*1080)
2.原图信息

(2)转换为位图

1.使用工具有Photoshop和电脑自带的画图工具或者IrfanView更改图片的色彩格式、位深度,将原图转化为以下图片,分别有32位、24位、16位彩色和256色、16色、单色的位图(BMP)文件,png,gif,jpg,bmp(前面的都是):

2.计算位图方式(以sky_24位彩色为例):2240108024/8/1024=7087.5KB/1024≈6.92MB,其他位图也可这样计算,宽度高度位深度/一个字节8个比特位/1024=多少KB

3.以sky_24位彩色为例,UltraEdit查看图片头文件信息如下

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

bfType   2字节 标识,就是“BM”二字  BMbfSize    4字节 整个BMP文件的大小  0x000C0036(786486)【与右键查看图片属性里面的大小值一样】bfReserved1/2  4字节 保留字,没用   0bfOffBits  4字节 偏移数,即 位图文件头+位图信息头+调色板 的大小  0x36(54)

5.色彩格式和图片文件格式都在影响图片大小:

(3)压缩率

1.原图片是sky.jpeg大小为1052KB,而gif的大小为1072KB,jpg大小为455KB,png为3172KB,bmp(以sky_24位彩色为例)为7088KB
比较大小:

PNG压缩比:-301.5%

BMP压缩比:-673.8%

JPG压缩比:43.3%

GIF压缩比:101.9%

二、区分位图

(1)16/32位位图对照

1.16位位图信息

2.32位位图信息

3.由上图可知4.61MB*2=9.22MB
16位位图所占存储空间大小比32位少,接近32位位图的一半,32位位图压缩了一半变成了16位位图

(2)256/16/单色位图对照

1.单色位图

2.16色位图

3.256色位图

4.三张图片的信息

单色:

16色:

256色:

可以清晰的发现颜色越多,图片越大

三、图片处理编程

(一)奇异函数分解(SDV)

1.代码

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("./Lena.jpeg", 'r')print(A)output_path = r'./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.jpeg' % (output_path, k))if k <= 50:plt.subplot(10, 5, k)plt.imshow(I)plt.axis('off')plt.title('奇异值个数:%d' % k)plt.suptitle('SVD与图像分解', fontsize=20)#plt.tight_layout(0.3, rect=(0, 0, 1, 0.92))# plt.subplots_adjust(top=0.9)plt.show()

2.运行结果

可以观察到,随着奇异值的增加图片变得越来越清晰。

(二)用图像的开闭运算(腐蚀-膨胀),检测出2个样本图像中硬币、细胞的个数

1.硬币代码

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("./coin.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((17, 17), 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)

2.结果

3.细胞代码

在这里插入代码片

4.结果

四、图片条形码定位

1.代码

import cv2
import pyzbar.pyzbar as pyzbar
import numpy
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片def decodeDisplay(img_path):img_data = cv2.imread(img_path)# 转为灰度图像gray = cv2.cvtColor(img_data, cv2.COLOR_BGR2GRAY)barcodes = pyzbar.decode(gray)for barcode in barcodes:# 提取条形码的边界框的位置# 画出图像中条形码的边界框(x, y, w, h) = barcode.rectcv2.rectangle(img_data, (x, y), (x + w, y + h), (0, 255, 0), 5)# 条形码数据为字节对象,所以如果我们想在输出图像上# 画出来,就需要先将它转换成字符串barcodeData = barcode.data.decode("utf-8")barcodeType = barcode.type#不能显示中文# 绘出图像上条形码的数据和条形码类型#text = "{} ({})".format(barcodeData, barcodeType)#cv2.putText(imagex1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,5, (0, 0, 125), 2)#更换为:img_PIL = Image.fromarray(cv2.cvtColor(img_data, cv2.COLOR_BGR2RGB))# 参数(字体,默认大小)font = ImageFont.truetype('msyh.ttc', 150)# 字体颜色(rgb)fillColor = (0, 255, 255)# 文字输出位置position = (x, y-50)# 输出内容str = barcodeData# 需要先把输出的中文字符转换成Unicode编码形式(  str.decode("utf-8)   )draw = ImageDraw.Draw(img_PIL)draw.text(position, str, font=font, fill=fillColor)# 使用PIL中的save方法保存图片到本地img_PIL.save('ma1.jpg', 'jpeg')# 向终端打印条形码数据和条形码类型print("扫描结果==》 类别: {0} 内容: {1}".format(barcodeType, barcodeData))ma1 = mpimg.imread('ma1.jpg')img = plt.imshow(ma1)plt.axis('off') # 不显示坐标轴plt.show()if __name__ == '__main__':decodeDisplay("ma.jpg")

2.原图

3.结果

五、总结

对位图有了更进一步的了解,对图像的编程处理也加强了学习,区分了位图的区别,图像颜色更多,图片更大,也知道了位图大小的计算。

六、参考链接

python实现读取并显示图片的两种方法

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

数字图像与机器视觉基础补充(1)——区分位图和图像处理相关推荐

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

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

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

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

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

    一.比较不同位深度BMP文件 从网页上下载一张彩色图片,查看该图片信息,显示位深度24 通过电脑画图程序和PS软件,分别将该图片保存为 32位.16位彩色和256色.16色.单色的位图(BMP)文件. ...

  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. jmeter全链路压测
  2. vs2005中文的,可是有180天的适用期,哪位高手能破了啊
  3. c 程序 实现一元二次方程
  4. 我在 SUN TECH DAY
  5. 数据分析报告应该包含的内容
  6. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_9 typeAliases标签和package标签
  7. 安装flash player提示版本不是最新,无法安装
  8. C语言实现动态数字雨
  9. mysql测评作业指导书_测评作业指导书
  10. checkio Ascending List
  11. MySql 使用关键字做字段名
  12. java接口自动化测试-导入xslx模板进行批量检索
  13. 趣点赞打不开显示服务器错误,资讯 – CSGO辅助
  14. 5分钟实现微信小程序绘制二维码
  15. (个人学习笔记)利用ensight进行EDEM耦合FLUENT后处理
  16. android图片消失动画效果,用setAnimationStyle来设置popwindow显示消失的动画效果
  17. 英语语法——状语和状语从句
  18. GBASE 8C——SQL参考6 sql语法(12)
  19. 用innobackupex做全量备份
  20. 开源嵌入式GIS引擎基于ucGUI

热门文章

  1. 一级计算机网络应用题目操作,计算机一级有什么用 主要考什么
  2. 我的Go+语言初体验——iPad上搭建Go+开发环境(ish版)
  3. 计算机毕业设计node.js+Vue+Element驾校信息管理系统
  4. Three.js - 几何体(五)
  5. 金蝶云星空与钉钉对接打通
  6. 深圳礼品展:节庆馈赠食品“卷”出新高地,美味又走心
  7. 磁浮列车速度跟踪控制系统中牵引制动系统的作用
  8. fsk调制解调matlab,FSK调制解调MATLAB源代码.docx
  9. CSS3元素与选择器
  10. 基于位置服务,手机定位