十一、图像二值化
一、二值圖像
其實就是把圖像轉換為只有黑白的兩種顏色圖像,即像素值非零即一
三角閾值二值化
對一個圖像進行操作,獲取圖像的直方圖,找到波峰和波谷進行連線設為線段A,每個點做有關線段A的垂線垂足在線段A上,最后將所有的垂足的橫坐標累加再加上一個偏量位移得到的值也就是圖像的閾值,通過這個閾值對整個圖像進行二值化操作。
二、圖像二值化的方法
1、全局閾值
OTSU:內方差最小,外方差最大(常用)
import cv2 import numpy as np from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)print("threshold value is:%s"%ret)cv2.imshow("OTSU",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
Triangle
import cv2 import numpy as np from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_TRIANGLE)print("threshold value is:%s"%ret)cv2.imshow("TRIANGLE",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
自動與手動設置閾值
①THRESH_BINARY手動設置閾值為127,像素值小于127為0黑色,大于127為255白色
import cv2 import numpy as np from matplotlib import pyplot as pltdef threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)ret,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)print("threshold value is:%s"%ret)cv2.imshow("binary",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)threshold(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
②THRESH_BINARY_INV手動設置閾值為127,取反效果,像素值小于127為255白色,大于127為0黑色
效果圖如下:
③THRESH_TRUNC手動設置閾值為127,截斷,像素值大于127為127,小于127為0黑色
效果圖如下:
④THRESH_TOZERO手動設置閾值為127,截斷,像素值小于127為0黑色,大于127像素值不變
效果圖如下:
2、局部閾值
Ⅰ局部自適應閾值方法
①THRESH_MEAN_C
MEAN_C:將圖片分為若干個小方格,求出每一個方格中像素的均值,判斷均值是否大于自定義的閾值,大于閾值為白色,小于閾值為黑色
adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10)
gray必須為灰度圖
255為maxValue
25為blockSize,必須是奇數
10為C,是一個常量,每個像素塊的均值與計算出來的均值差不能大于10,否則視為無效,其目的為了防止噪聲的影響
效果圖如下:
②THRESH_GAUSSIAN_C
GAUSSIAN_C:將圖片分為若干個小方格,求出每一個方格中像素的均值并乘以相應的高斯權重(中間的權重更大),判斷均值是否大于自定義的閾值,大于閾值為白色,小于閾值為黑色
adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)
gray必須為灰度圖
255為maxValue
25為blockSize,必須是奇數
10為C,是一個常量,每個像素塊的均值與計算出來的均值差不能大于10,否則視為無效,其目的為了防止噪聲的影響
效果圖如下:
Ⅱ自己計算均值然后對圖像進行分割從而達到圖像二值化效果
import cv2 import numpy as np from matplotlib import pyplot as pltdef custom_threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)h,w = gray.shape[:2]m = np.reshape(gray,[1,h*w])mean = m.sum()/h*wprint("mean:",mean)ret ,binary = cv2.threshold(gray,mean,255,cv2.THRESH_BINARY)cv2.imshow("binary",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)custom_threshold(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
三、超大圖像二值化
Ⅰ自動全局方法操作
思想:對超大圖像進行分塊二值化操作
import cv2 import numpy as np from matplotlib import pyplot as pltdef big_image_binary(image):print(image.shape)cw = 256ch = 256h,w = image.shape[:2]gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)for row in range(0,h,ch):for col in range(0,w,cw):roi = gray[row:row+ch,col:col+cw]ret,dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)gray[row:row+ch,col:col+cw] = dstprint(np.std(dst),np.mean(dst))cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big1.jpg",gray)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE) big_image_binary(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
對圖像噪聲進行過濾之后進行全局二值化操作
import cv2 import numpy as np from matplotlib import pyplot as pltdef big_image_binary(image):print(image.shape)cw = 256ch = 256h,w = image.shape[:2]gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)for row in range(0,h,ch):for col in range(0,w,cw):roi = gray[row:row+ch,col:col+cw]print(np.std(roi),np.mean(roi))dev = np.std(roi)if dev < 15:gray[row:row+ch,col:col+cw] = 255else :ret,dst = cv2.threshold(roi,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)gray[row:row+ch,col:col+cw] = dstcv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big3.jpg",gray)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE) big_image_binary(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
Ⅱ自適應局部方法操作
import cv2 import numpy as np from matplotlib import pyplot as pltdef big_image_binary(image):print(image.shape)cw = 256ch = 256h,w = image.shape[:2]gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)for row in range(0,h,ch):for col in range(0,w,cw):roi = gray[row:row+ch,col:col+cw]dst = cv2.adaptiveThreshold(roi,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,127,20)gray[row:row+ch,col:col+cw] = dstprint(np.std(dst),np.mean(dst))cv2.imwrite(r"G:\Juptyer_workspace\study\opencv\opencv3\big2.jpg",gray)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\big.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE) big_image_binary(src)cv2.waitKey(0) cv2.destroyAllWindows()效果圖如下:
總結
- 上一篇: 哈尔滨看输卵管粘连最好的医院推荐
- 下一篇: 十二、图像金字塔