OpenCV 教程 之 圖像處理

2021-02-15 MATLAB仿真之家
1、安裝
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
# 注意需要安裝numpy庫,這是Python中進行矩陣操作與運算庫,類似與MATLAB運算

2、圖像處理基本操作

在圖像處理過程中,讀取圖像、顯示圖像、保存圖像是最基本的操作。以下簡單介紹這幾項基本操作,以下操作都基於上圖:ex1.png

2.1 讀取、顯示、寫入圖像
# OpenCV提供了函數cv2
# 使用.imread()方法來讀取圖像,支持各種靜態圖像格式,用法如下:
imread(filename, flags=None)
# 返回值是讀取到的圖像數據。如果未讀取到圖像,則返回「None」。
# filename:完整的圖像文件名
# flags:讀取標誌,-1保持原格式不變、0灰度圖像、1 RGB圖像、2、4以任何可能的顏色格式讀取圖像
imshow(winname, mat)  # 顯示圖片
# winname 窗口名
# mat 數據矩陣
imwrite(filename, img, params=None)  # 寫入圖片
# filename 文件名
# img 圖片數據
# params 參數
waitKey(delay=None)  # 窗口等待關閉
# delay 等待延時,單位ms


import cv2
img = cv2.imread("ex1.png")  # 原圖
imgGrey = cv2.imread("ex1.png",0)  # 灰度圖
cv2.imshow("img",img)
cv2.imshow("imgGrey",imgGrey)
cv2.waitKey()  # 等待關閉圖片
cv2.imwrite("Copy.jpg",img)

2.2 圖像顯示窗口創建與銷毀
namedWindow(winname, flags=None) # 創建一個窗口
# winname 窗口名
# flags 指定窗口大小模式:cv2.WINDOW_AUTOSIZE:根據圖像自動創建大小
#                                        cv2.WINDOW_NORMAL:窗口大小可調整
#                                  cv2.destoryAllWindows(窗口名) # 刪除任何建立的窗口

import cv2
img = cv2.imread("ex1.png")
cv2.namedWindow("win1", cv2.WINDOW_AUTOSIZE)  # 創建窗口
cv2.imshow("win1", img)  # 在指定窗口顯示,若窗口不存在,自動創建
cv2.waitKey()
cv2.destroyAllWindows()

2.3 圖片寬、高、通道數、平均值獲取
img.shape 返回圖像高(圖像矩陣的行數)、寬(圖像矩陣的列數)和通道數3個屬性組成的元組
若圖像是非彩色圖,則只返回高和寬組成的元組。
import cv2
img = cv2.imread("ex1.png")
imgGrey = cv2.imread("ex1.png", 0)
print(img.shape)
print(imgGrey.shape)

2.4 圖像像素數目和圖像數據類型獲取
import cv2
img = cv2.imread("ex1.png")
print(img.size)  # 圖像的像素總數目
print(img.dtype)  # 圖像數據類型(通常是uint8)

2.5 生成指定大小的空圖像
import cv2
import numpy as np
img = cv2.imread("ex1.png")
imgZero = np.zeros(img.shape, np.uint8)
imgFix = np.zeros((300, 500, 3), np.uint8)  # 第一個是高,第二個是寬
imgFix = np.zeros((300, 500), np.uint8)  # 灰度圖

2.6 訪問和操作圖像像素
# OpenCV中圖像矩陣的順序是B、G、R。可以直接通過坐標位置訪問和操作圖像像素。
# 參照numpy索引與賦值
import cv2
img = cv2.imread("ex1.png")
print(img[100:120, 500:550])
img[100:120, 500:550] = (0, 0, 255)
cv2.imshow("img", img)
cv2.waitKey()

# 可以對不同顏色通道進行修改 BGR
# 需要注意的是,由於歷史遺留問題,opencv採用BGR模式,而不是RGB
import cv2
img = cv2.imread("ex1.png")
img[0:100, 100:200, 0] = 255
img[100:200, 200:300, 1] = 255
img[200:300, 300:400, 2] = 255
cv2.imshow("img", img)
cv2.waitKey()

2.7 圖像三通道分離和合併
# 分離圖像通道可以使用cv2中的split函數,合併使用merge函數。
import cv2
img = cv2.imread("ex1.png")
b, g, r = cv2.split(img)
# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]

merged = cv2.merge([b, g, r])
cv2.imshow("Blue", b)
cv2.imshow("Green", g)
cv2.imshow("Red", r)
cv2.imshow("Merged", merged)
cv2.waitKey()

2.8 在圖像上輸出文字
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
# img:圖像
# text:要輸出的文本
# org:文字的起點坐標
# fontFace:字體
# fontScale:字體大小
# color:字體顏色
# thickness:字圖加粗

import cv2
img = cv2.imread("ex1.png")
cv2.putText(img, "Print some text to img", (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255))
cv2.imshow("img", img)
cv2.waitKey()

2.9 圖像縮放
resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
# src 縮放的圖片
# dsize 縮放後的尺寸 (高、寬)

import cv2
img = cv2.imread("ex1.png")
height, width = img.shape[0:2]
img1 = cv2.resize(img, (width//2, height//2), cv2.INTER_AREA)  
# 地板除,像素只能是整數
cv2.imshow('img2', img1)
cv2.waitKey()

"cv2.INTER_AREA"是定義的縮放插值方法。共有5種:
1)INTER_NEAREST - 最近鄰插值法
2)INTER_LINEAR - 雙線性插值法(默認)
3)INTER_AREA - 基於局部像素的重採樣(resampling using pixel area relation)。對於圖像抽取(image decimation)來說,這可能是一個更好的方法。但如果是放大圖像時,它和最近鄰法的效果類似。
4)INTER_CUBIC - 基於4x4像素鄰域的3次插值法
5)INTER_LANCZOS4 - 基於8x8像素鄰域的Lanczos插值
為了最好的縮放效果,縮小推薦使用 "cv2.INTER_AREA";  擴大推薦使用 「cv2.INTER_CUBIC」

2.10 圖像遍歷
# 遍歷運行太慢,最好使用矩陣操作
import cv2
img = cv2.imread('ex1.png')
height = img.shape[0]
weight = img.shape[1]
channels = img.shape[2]

for row in range(height):  # 遍歷高
   for col in range(weight):  # 遍歷寬
       for c in range(channels):  # 遍歷各通道
           value = img[row, col, c]
           img[row, col, c] = 255 - img[row, col, c]  # 操作像素

cv2.imshow('result', img)
cv2.waitKey()

2.11大津閾值
import cv2

img = cv2.imread('ex1.png', 0)  # 按灰度圖讀入

# ret 是自動選擇的大津分割閾值   img_binary 是二值化圖像
ret, img_binary = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)  # 大津閾值
# ret, binary = cv.threshold(img, 100, 255, cv.THRESH_BINARY) # 指定閾值

# cv2.imshow('Source image', img)
cv2.imshow('THRESH_OTSU', img_binary)
cv2.waitKey()

相關焦點

  • OpenCV使用CUDA處理圖像的教程與實戰
    在單張圖像上使用在多張圖像上使用對多張圖像使用Dask進行並行延時處理我們需要創建GPU空間(GPU_frame)來保存圖像(就像相框保存圖片一樣),然後才能將圖像上傳到>gpu_frame.upload(screenshot)第2步:處理圖像OpenCV CUDA函數返回cv2.cuda_GpuMat(GPU矩陣),因此每個結果都可以在用戶不必重新上傳的情況下進行操作。
  • 在Windows配置Python的圖像處理(pillow,matplotlib,opencv)
    介紹1.1 介紹Python處理圖像有幾個常用的庫,包括Pillow、Matplotlib、OpenCV,今天童鞋們就跟著福哥對這三種庫進行一個初步了解吧。我們先學習這三個庫的安裝方法,再學習這三個庫的基本使用方法,大家可以根據實際情況進行選擇。2.
  • OpenCV DNN模塊官方教程(一)加載Caffe模型做圖像分類
    OpenCV DNN模塊官方教程地址如下,可以查看各個對應的使用方法。
  • OpenCV之圖像處理基礎
    、像素的訪問和操作、感興趣區域處理、通道處理等知識點。需要說明的是,在使用面向python的OpenCV必須熟練掌握Numpy庫,尤其是Numpy.array庫是python處理圖像的基礎。圖像的基本表示方法這裡只討論二值圖像、灰度圖像、彩色圖像的基本表示方法。二值圖像二值圖像是指僅僅包含黑色和白色兩種顏色的圖像。在計算機中,將白色像素點處理為「1」,將黑色像素點處理為「0」,以方便進行後續的存儲和處理等操作。
  • 使用Python+OpenCV實現圖像數據採集
    conda create -n opencv python=3.6這將在Python版本3.6中創建一個名為opencv的新環境,可以用正在使用的任何版本替換它。pip install opencv-python
  • 基於OpenCV的實用圖像處理操作
    良好的圖像處理結果會為後續的進一步處理帶來很大的幫助,例如提取到圖像中的直線有助於對圖像中物體的結構進行分析,良好的特徵提取會優化深度學習的結果等。今天我們來回顧一下圖像處理中的最基礎的,但是卻非常實用的一些操作。圖像處理圖像處理始於計算機識別數據。首先,為圖像格式的數據創建一個矩陣。圖像中的每個像素值都被處理到此矩陣中。
  • OpenCV系列之圖像平滑 | 十六
    LPF有助於消除噪聲,使圖像模糊等。HPF濾波器有助於在圖像中找到邊緣。OpenCV提供了一個函數cv.filter2D來將內核與圖像進行卷積。例如,我們將嘗試對圖像進行平均濾波。5x5平均濾波器內核如下所示:操作如下:保持這個內核在一個像素上,將所有低於這個內核的25個像素相加,取其平均值,然後用新的平均值替換中心像素。
  • OpenCV實戰:人臉關鍵點檢測(FaceMark)
    本教程主要參考Facemark : Facial Landmark Detection using OpenCV[1]截止到2018-03-20,OpenCV3.4可支持三種人臉關鍵點檢測,但目前只能找到一種已訓練好的模型,所以本教程只介紹一種實現人臉關鍵點檢測的算法。而且此類算法還沒有Python接口,所以這裡只介紹C++的代碼實現。
  • 模板識別:使用OpenCV實現基於特徵的圖像對齊
    中間的表在經過圖像對齊技術處理之後結果如右圖所示,可以和左邊的模板一樣。對齊之後就可以根據模板的格式對用戶填寫的內容進行分析了。在許多文檔處理應用程式中,第一步是將掃描或拍攝的文檔與模板對齊。例如,如果要編寫自動表單閱讀器,最好先將表單與其模板對齊,然後根據模板中的固定位置讀取欄位。在一些醫學應用中,可以把多次拍攝的照片拼接起來。圖像對齊最有趣的應用可能是創建全景圖。在這種情況下,兩個圖像不是平面的圖像而是3D場景的圖像。通常,3D對齊需要深度信息。
  • 24、opencv圖像仿射變換
    在第一種情況下,有一個想要轉換的圖像; 在第二種情況下,有一個想要計算轉換結果的點列表。這些情況在概念上非常相似,但在實際方面卻非常不同。因此,OpenCV有兩種不同的功能。在第一種情況下,輸入和輸出格式是圖像,並且隱含的要求是扭曲假定像素是底層圖像的密集表示。這意味著圖像變形必須處理插值,以便輸出圖像平滑且看起來很自然。
  • 教程 | 攝影愛好者玩編程:利用Python和OpenCV打造專業級長時曝光攝影圖
    機器之心對該教程進行了簡要的介紹。長時曝光是攝影師最喜歡的攝影技術之一,運用長時曝光技術可以拍出展示時光流逝的圖片,而這是傳統技術難以企及的。我們經常使用這種技術表達流光夜景或柔順的流水。優秀的長時曝光作品是攝影師對快門速度、光圈大小和 ISO 感光度的完美把控,那麼我們如何使用 Python 和 OpenCV 庫來實現這種長時曝光的效果呢?
  • 《基於Csharp+OpenCV圖像處理實戰》帶你從一線實戰視角,實打實分析具體視覺問題
    其中OpenCVSharp和GOCW各有優勢,我們會在後續課程中多次使用;第二課:在Csharp中引入視頻採集模塊的構建,處理視頻採集和圖像處理之間的關係;第三課:視頻採集專用的SDK和「陪練」系統的介紹和使用;第四課:在視頻增強類項目中和圖像處理項目中,算法的選擇要點;第五課:Csharp界面設計、圖片的存儲和其他構建設計;第六課
  • 基本概念:亮度、對比度、飽和度、銳化、解析度【數字圖像處理系列二】
    python版本:python3.5.4 ; opencv-python版本:opencv-python3.4.2.17使用的開發環境是
  • opencv教程-圖像直方圖
    mask:計算全圖用None,計算roi需要獲取對應的mast圖像。    histSize:直方圖bins。    ranges:顏色值範圍,對於圖像是[0,256]。2:直方圖均衡化    其基本思想是將直方圖從局部聚集拉伸到全局範圍,可以用來處理過暗或者過亮的圖像,增強圖像對比度。
  • TensorFlow進行簡單的圖像處理
    TensorFlow進行簡單的圖像處理簡單概述作為計算機視覺開發者,使用TensorFlow進行簡單的圖像處理是基本技能,
  • 【OpenCV入門之十二】看起來一樣的圖像竟然存在這麼大的差別!
    對輸入的兩張圖像計算得到直方圖H1與H2,歸一化到相同的尺度空間然後可以通過計算H1與H2的之間的距離得到兩個直方圖的相似程度進而比較圖像本身的相似程度。Opencv提供的比較方法有四種:#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace std;using namespace cv;string convertToString(double
  • OpenCV3.3深度學習模塊(DNN)應用-圖像分類
    semantical segmentation network)VGG-based SSD (object detection network)MobileNet-based SSD (light-weight object detection network)一:GoogleNet Caffe模型數據說明OpenCV通過支持加載這些預先訓練好的模型,實現圖像分類
  • OpenCV常用圖像拼接方法(二) :基於模板匹配拼接
    OpenCV常用圖像拼接方法將分為四部分與大家分享,這裡是第二種方法,歡迎關注後續,本文源碼與素材連結位於文章末尾
  • 與課堂---OpenCV-1
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以實現圖像處理和計算機視覺方面的很多通用算法/opencv-3-1.html下載下來的是一個.exe文件,其實是一個壓縮包--Visual Studio 2015 中文社區版 由於opencv
  • 基於OpenCV的圖像強度操作
    更改任何通道中的像素值對圖像的數學運算亮度變化對比度變化伽瑪操縱直方圖均衡圖像預處理中的濾波等增強使用OpenCV從該通道中的每個像素中減去均值方法2(用於深度學習)將所有圖像分割成各自的通道,對於所有圖像的每個通道:為每個圖像找到該通道的均值。查找所有計算出的均值的均值。