OpenCV Blending 技术
文章目录
OpenCV Blending 技术 的介绍说明。
如果没有使用 blending,那么是这种效果
两个图像拼接起来的时候,希望有 羽化的效果。
常见的关键词
Feathering / Linear blending
\begin{equation} I_{blend}=\alpha I_{left}+(1-\alpha) I_{right} \end{equation}
Alpha Blending / Feathering
是下图中所示的样子吗? 中间是灰色的
在各个维度上进行 alpha blending
Setting alpha: simple averaging:Alpha = .5 in overlap region
Setting alpha: center seam: Setting alpha: center seam
Setting alpha: center seam:Alpha = blurred
Setting alpha: center weighting:Alpha = dtrans1 / (dtrans1+dtrans2)
Setting alpha: center seam
Setting alpha: blurred seam
Setting alpha: simple averaging
Setting alpha: center weighting
“Optimal” Window: smooth but not ghosted
Good Window Size
Coarse structure should blend very slowly between images (lots of feathering), while fine details should transition more quickly.
Coarse structure should blend very slowly between images (lots of feathering), while fine details should transition more quickly.
Affect of Window Size
Multi-band / Pyramid Blending
Image mode 相关知识点
PIL mode
9种,分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
-
模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。
-
模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的 L = R * 299/1000 + G * 587/1000+ B * 114/1000
-
模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。
-
模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。
-
模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。 四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色)。PIL中“RGB”转换为“CMYK”的公式如下: C = 255 - R M = 255 - G Y = 255 - B K = 0
-
模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。 模式“RGB”转换为“YCbCr”的公式如下: Y= 0.257R+0.504G+0.098B+16 Cb = -0.148R-0.291G+0.439B+128 Cr = 0.439R-0.368G-0.071*B+128
-
模式“I”为32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“I”模式是按照下面的公式转换的: I = R * 299/1000 + G * 587/1000 + B * 114/1000
-
模式“F”为32位浮点灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。在PIL中,从模式“RGB”转换为“F”模式是按照下面的公式转换的: F = R * 299/1000+ G * 587/1000 + B * 114/1000
-
模式“F”与模式“L”的转换公式是一样的,都是RGB转换为灰色值的公式,但模式“F”会保留小数部分. 模式“RGB”为24位彩色图像,它的每个像素用24个bit表示,分别表示红色、绿色和蓝色三个通道。 在PIL中,对于彩色图像,open后都会转换为“RGB”模式,然后该模式可以转换为其他模式,比如“1”、“L”、“P”和“RGBA”,这几种模式也可以转换为“RGB”模式。
-
RGB 和灰白图的相互转换
PIL包中Image模块的convert()函数的具体使用:
模式L为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的: L = R * 0.299 + G * 0.587+ B * 0.114
模式 L
和模式 1
的区别在于:前者是 8位像素,存在灰色的像素(过渡像素);后者是1 位像素,只是黑白两色,其中的阈值一般设置为 128,是可以修改阈值,但仍然是容易出现抖动的现象。
对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。
openCV中的图像的通道可以是 1,2,3 和4。其中常见的是 1通道和 3通道,4通道,其中2通道不常见。
|
|
Histograms
关于 opencv 中的histogram 的使用。
So what is histogram ? You can consider histogram as a graph or plot, which gives you an overall idea about the intensity distribution of an image. It is a plot with pixel values (ranging from 0 to 255, not always) in X-axis and corresponding number of pixels in the image on Y-axis. 定义, 是关于pixel 密度分布的图像
对于灰度图,channel 是0, 对于RGB 图片
For color image, you can pass [0],[1] or [2] to calculate histogram of blue,green or red channel respectively.
|
|
- images : it is the source image of type uint8 or float32. it should be given in square brackets, ie, “[img]”.
- channels : it is also given in square brackets. It the index of channel for which we calculate histogram. For example, if input is grayscale image, its value is [0]. For color image, you can pass [0],[1] or [2] to calculate histogram of blue,green or red channel respectively.
- mask : mask image. To find histogram of full image, it is given as “None”. But if you want to find histogram of particular region of image, you have to create a mask image for that and give it as mask. (I will show an example later.)
- histSize : this represents our BIN count. Need to be given in square brackets. For full scale, we pass [256].
- ranges : this is our RANGE. Normally, it is [0,256].
关于bin 的理解: hist 中 x轴是 [0, 255] 的颜色值,y 轴是对应数值的数量。所以默认情况下,bins 的256, 但是可以把不同的数值当做一个整体看待,这样的话,就出现了bin的概念。
关于 mask的使用
We used cv2.calcHist() to find the histogram of the full image. What if you want to find histograms of some regions of an image? Just create a mask image with white color on the region you want to find histogram and black otherwise. Then pass this as the mask. 对于mask 的定义十分准确,white color 是想要的,black color 是屏蔽掉的。所以可以单独获得某一个区域的 histogram 信息。
Histograms - 1 : Find, Plot, Analyze !!!
参考文献
图像类型
在计算机中,按照颜色和灰度的多少可以将图像分为四种类型:
- 二值图像
- 灰度图像
- 索引图像
- RGB图像
- 二值图像(位图模式)
一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
位图模式的图像也叫做黑白图像,它包含的信息最少,因而图像也最小。当一幅彩色图像要转换成黑白(位图)模式时,不能直接转换,必须先将图像转换成灰度模式。
- 灰度图像
灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。二值图像可以看做是灰度图像的一个特例。
|
|
灰度通常表示方法是百分比,范围从0%到100%。注意此百分比以纯黑为基准。 与RGB正好相反,百分比越高颜色越偏黑,百分比越低颜色越偏白。
- RGB模式
RGB模式是相加的模式,当R、G、B的值都达到最大值时,三色合成便成白色。
图片也可以看作是三层二维数组的叠加,每一层二维数组都是一个通道。单通道的图像是灰色的,每个像素pixel只有一个value,数字越高,颜色越白,也就越亮。
RGB 格式里(0,0,0)代表着黑色,(255,255,255)代表着白色。R channel数值越高,说明颜色中含有的红色分量越多。
- 图像通道
PNG图像(便携式网络图形(Portable Network Graphics))是一种典型的4通道图像。alpha通道可以赋值0到1,或者0到255,表示透明到不透明。其实任何一张彩图都是4通道图像,只是读不读的问题。Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区。
- GRAY颜色模型
GRAY模型并不是一个彩色模型,他是一个灰度图像的模型,其命名使用的是英文单词gray的全字母大写。常用的RGB模型转成灰度图的方式如式中所示:
\begin{equation} \mathrm{Gray}=\mathrm{R} * 0.3+\mathrm{G} * 0.59+\mathrm{B} * 0.11 \end{equation}
读取图片函数:
Image.open()读取的通道顺序是RGB,cv2.imread()读取的通道顺序为BGR。
显示的区别:
cv2.imshow()采用BGR模式
plt.imshow() 采用RGB模式
Opencv转PIL.Image
cv2_img = cv2.cvtColor(numpy.asarray(Img_img),cv2.COLOR_RGB2BGR)
PIL.Image转Opencv
pil_img = Image.fromarray(cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB))
使用 cv2 处理图像的时候
|
|
cv2.imread()会默认以彩色模式读取图片,这样黑白图片读取后也成了三通道,想以图片原始模式读取使用
|
|
使用PIL 处理图像
|
|
重要的一点时图像只要经过转换及存储后,其模式就不会变,只是读取时以不同的模式读会有差异,不用担心
读入图像通道
对于Image.open()函数默认真彩图像读取通道顺序为RGB,而cv2.imread()则是BGR。同时,当图像格式为RGBA时,Image.open(‘—.jpg’)读取的格式为RGBA(其中A表示图像的alpha通道,即RGBA共四个通道),而cv2.imread('—.jpg')读取的格式是BGR,只有三个通道。
|
|
OpenCV转换成PIL.Image格式
OpenCV转换成PIL.Image格式:
|
|
PIL.Image转换成OpenCV格式:
|
|
文章作者 jijeng
上次更新 2020-03-27