日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十一、图像二值化

發布時間:2023/12/1 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十一、图像二值化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、二值圖像

其實就是把圖像轉換為只有黑白的兩種顏色圖像,即像素值非零即一

三角閾值二值化

對一個圖像進行操作,獲取圖像的直方圖,找到波峰和波谷進行連線設為線段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黑色

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_INV)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_TRUNC手動設置閾值為127,截斷,像素值大于127為127,小于127為0黑色

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_TRUNC)print("threshold value is:%s"%ret)cv2.imshow("TRUNC",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_TOZERO手動設置閾值為127,截斷,像素值小于127為0黑色,大于127像素值不變

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_TOZERO)print("threshold value is:%s"%ret)cv2.imshow("TOZERO",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()

效果圖如下:

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,否則視為無效,其目的為了防止噪聲的影響

import cv2 import numpy as np from matplotlib import pyplot as pltdef local_threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,10)cv2.imshow("MEAN_C",binary)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow("image",src) cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)local_threshold(src)cv2.waitKey(0) cv2.destroyAllWindows()

效果圖如下:

②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 local_threshold(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,10)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) local_threshold(src) cv2.waitKey(0) cv2.destroyAllWindows()**

效果圖如下:

Ⅱ自己計算均值然后對圖像進行分割從而達到圖像二值化效果

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()

效果圖如下:


總結

以上是生活随笔為你收集整理的十一、图像二值化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。