一、图像的基础
1、像素
这是数字图像中的最小的单元,像素是图像的子采样形式。合并像素以提供完整的图像。
2、图像分辨率
这是图像中出现的像素数。图像包含行和列中的像素,例如640 * 480表示我们有640像素列和480像素行。通过将行中的像素乘以列中的像素来计算像素的总数。
3、测量图像分辨率的单位
有两个用于测量图像分辨率的基本单位
- 每英 寸像素数(PPI)
- 每英寸点数(DPI)
4、位图图像
通过将像素值(整数)转换为字节得到的。它们用0和1表示。
5、图像压缩
- 无损压缩
- 有损压缩
6、无损压缩
这只会减小图像的大小而不会降低质量。

无损压缩过程
7、有损压缩
有损压缩会使质量有一定的损失,它优先考虑节省空间而不是质量。

有损压缩过程
8、图像文件格式
JPEG:联合图像专家组,有损压缩,照片和绘画。
TIFF:标记的图像文件格式,无损压缩,文档存储、游戏和动画。
GIF:位图图像格式,无损压缩,游戏和动画
BMP:位图,独立于显示设备,在windows中缺乏压缩。
PNG:便携式网络图形,无损压缩,通过互联网传输图像。
WebP(由谷歌开发的格式)有损和无损压缩,程序中的消息图片。
SVG:可缩放的向量图形,用于交互和动画,应用也Web开发
二、颜色空间

1.RGB颜色模型 2.HSL颜色模型 3.HSV颜色模型
1、颜色模型
颜色模型RGB是最常用的图像数据,也是非常古老的颜色编码。后来HSV(色调饱和度明度)和HSL(色调饱和度亮度)被开发出来,并且发现它与人类感知颜色的方式更紧密地对齐。
RGB - 所有三个颜色的值均为0到255,特定颜色由RG和B的组合定义。
HSL和HSV - 模型的颜色是我们正在寻找的色调,饱和度是我们有多少色调,亮度代表它的明暗度。
- RGB(红色,绿色,蓝色)
- XYZ(阈值超出饱和度)
- HSL / HSV(色调,饱和度,明暗度)
- LAB(明亮度, 从洋红色至绿色的范围 , 从黄色至蓝色的范围 )
- LCH(明亮度,饱和度,色相)
- YUV(明亮度,色度,饱和度)
- YPbPr( 色差分量接口 )
2、在Opencv中读取和更改颜色空间
Opencv以BGR格式读取图像
import cv2import matplotlib.pyplot as pltimg = cv2.imread('puppy.jpg')plt.imshow(img)


BGR图像
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.imshow(img)


RGB图像
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)plt.imshow(img)


HSV图像
img = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)plt.imshow(img)


HLS图像
3、使用Opencv混合2张图像
(1)混合两个大小相同的图像
img1 = cv2.imread('../DATA/dog_backpack.png')img2 = cv2.imread('../DATA/watermark_no_copy.png')img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)img1 =cv2.resize(img1,(1200,1200))img2 =cv2.resize(img2,(1200,1200))plt.imshow(img1)plt.imshow(img2)


图像1和图像2
blended = cv2.addWeighted(src1=img1,alpha=0.7,src2=img2,beta=0.3,gamma=0)plt.imshow(blended)

调整alpha,beta和gamma值!

(2)混合两个不同大小的图像
img1 = cv2.imread('../DATA/dog_backpack.png')img2 = cv2.imread('../DATA/watermark_no_copy.png')img2 =cv2.resize(img2,(600,600))img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

图像1的形状为(1401,934,3),图像2的形状为(600,600,3)
为了混合不同尺寸的图像,你需要确定ROI(感兴趣区域),并且图像需要蒙版图像(黑色背景)
x_offset=934-600y_offset=1401-600# Creating an ROI of the same size of the foreground image (smaller image that will go on top)rows,cols,channels = img2.shape# roi = img1[0:rows, 0:cols ] # TOP LEFT CORNERroi = img1[y_offset:1401,x_offset:943] # BOTTOM RIGHT CORNER# Now create a mask of logo and create its inverse mask alsoimg2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)mask_inv = cv2.bitwise_not(img2gray) #this creates the image as B&W with black as backgroundplt.imshow(mask_inv,cmap='gray')


## Create the mask as 3 dimensional (RGB)white_background = np.full(img2.shape, 255, dtype=np.uint8)bk = cv2.bitwise_or(white_background, white_background, mask=mask_inv)fg = cv2.bitwise_or(img2, img2, mask=mask_inv)## put the original on the mask image to blendfinal_roi = cv2.bitwise_or(roi,fg)large_img = img1small_img = final_roilarge_img[y_offset:y_offset+small_img.shape[0], x_offset:x_offset+small_img.shape[1]] = small_imgplt.imshow(large_img)


4、自适应阈值
Opencv在cv2.threshold中提供了各种阈值
让我们使用实时自适应阈值处理
img = cv2.imread("../DATA/crossword.jpg
















