计算机视觉基础 - OpenCV3 关键运行机制汇总

之前在 Udacity 的计算机视觉工程师的课程里接触了不少 OpenCV 的操作,但还是想更加系统的学一下,所以在通过 《Learning OpenCV 3 Computer Vision with Python》和其他资源进一步熟悉 OpenCV,前面这本书在出版社 Packt 的主页上支持免费下载,所以喜欢看原版书的可以自行下载。在这里零散的记录一些容易被忽略的要点,以备查看:

  • 除非使用 cv2.IMREAD_UNCHANGED 图片读入模式,否则 imread() 都会忽略 α 通道的透明度信息,与此同时,imwrite() 要求被输出的图片必须是 grascyle 或者通道按照 BGR 排列的图片。
imread Flags
  • OpenCV 进行图片读取时,如果没有成功获取到图片,并没有任何提醒,而后续操作也可能会出现很奇异的报错,因此比较安全的做法是通过代码确定图片读入成功:
if img is None:
    raise Exception("Please check the availability of the image file!")
  • 在视频读取中,实例化 VideoCapture() 后的 get() 方法不是总能得到准确的 FPS 值,因此需要通过其他方式,如手动计时来进一步获得这个信息
cap = cv2.VideoCapture(0) # Here 0 is the index of the video camera

# Check if the camera opened successfully
if cap.isOpened() == False:
    print("Unable to read camera feed")

# Get the frame size information for output usage
frame_width = int(cap.get(3)) # frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(4)) # frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# Get the frame per second information
fps = cap.get(cv2.CAP_PROP_FPS)
  • cv2.waitKey(0) & 0xFF:在某些系统中,单纯的使用 cv2.waitKey() 时的返回值可能会超过正常 ASCII 中的取值范围,而 0xFF 对应的二进制数值的最后 8 位为 11111111,因此通过 cv2.waitKey(0) & 0xFF 可以确保返回的是 8 位的比特值

  • Erosion & Dilation: 二者为最基本的形态相关的操作,二者的输入都需要是binary image,Erosion 会移除物体边缘的像素以缩小被处理物体的尺寸,而 dilation 则会增加被处理物体的尺寸:

# Create a binary thresholded image
retval, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
dilation = cv2.dilate(binary, kernel, iterations=1)
erosion = cv2.erode(binary, kernel, iterations=1)
Morphological operations - erosion & dilation
  • Opening VS Closing: Opening 在 erosion 后执行 dilation 操作,用于降噪;而 Closing 则是先执行 dilation 后再进行 erosion 操作,用于关闭图片中的孔洞或移除黑色斑点
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
  • RGB to Gray: 在 OpenCV 中,RGB 图片转换成灰度图片时,同一个位置上的像素的强度计算方法为:gray = rgb[0, :, :] * 0.299 + rgb[1, :, :] * 0.587 + rgb[2, :, :] * 0.114

直方统计

直方图 Histogram 这一统计工具由于操作简单而又可以提供很多的信息,因而在计算机视觉中被得以广泛的应用。例如:通过对于图片上不同通道或灰度图片的强度 Intensity 的直方图统计可以获得关于图片色彩分布和对比度情况的信息,在 HOG, Histogram of Oriented Gradient 算法中通过统计图片中各个子区域的梯度信息来完成特征构建。

Histograms Equalization

当通过直方图对图片强度信息统计后会经常发现图片本身的强度信息并不是均匀分布的,而是在不同的强度区域有所集中。为了增加图片的对比度 contrast,可以通过执行直方均衡来改善图片的质量。这一变换更为一般的关系为:

  • g(i, j) = αf(i, j) + β,其中 α 调节对比度情况,而 β 调节亮度情况
img = cv2.imread('moutain.jpg', 0)
# Global histogram equalization
equalized = cv2.equalizeHist(img)
combined = np.hstack((img, equalized))
plt.imshow(combined, cmap='gray')
plt.xticks([]), plt.yticks([]);

执行 Histogram Equalization 前后的图片效果如下:

Equalized histogram
CLAHE (Contrast Limited Adaptive Histogram Equalization)

前述 HE 操作是针对图片的全局信息进行操作的,在实际使用中,有很多情况下仅考虑局部信息的直方均衡会取得更好的效果。CLAHE 在使用中仅考虑预先设定的图片区域(默认 8x8)内的直方统计情况,并且当某一区域内的对比度超过算法的设定值(默认 40)时,会对造成这个区域过高对比度的像素强度执行裁剪 clip ,最后再通过对分块区域的边缘进行插值过渡。

img = cv2.imread('moutain',0)
# create a CLAHE object (Arguments are optional).
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahed = clahe.apply(img)
CLAHE before and after

Gamma 校正

Gamma 校正通过对输入图片的像素施加非线性变换而修改图片像素的亮度,也正是由于这个非线性变换关系,使得 Gamma 校正相比于对比度调整更加不容易造成饱和现象,其变换关系为:

  • O = (I / 255)gamma x 255

When γ < 1, the original dark regions will be brighter and the histogram will be shifted to the right whereas it will be the opposite with γ > 1.

参考阅读

  1. Understanding Camera Histograms - Tones and Contrast

  2. Understanding Camera Histograms - Luminosity & Color

  3. Histogram equalization explaination from Wikipedia

  4. Histograms in OpenCV

  5. Understanding Gamma Correction

  6. Basic Image Transformation in OpenCV

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容