前言
對比度,邊沿檢測等等
直方圖
import numpy as np
from sklearn import preprocessing
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import Binarizer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from fancyimpute import KNN
from sklearn.covariance import EllipticEnvelope
from sklearn.preprocessing import LabelBinarizer, MultiLabelBinarizer
from sklearn.feature_extraction import DictVectorizer
from sklearn.neighbors import KNeighborsClassifier
import cv2
from matplotlib import pyplot as plt
img1=cv2.imread("1.jpg",cv2.IMREAD_GRAYSCALE)
h,w=img1.shape[:2]
#直方圖均衡化
img2=cv2.equalizeHist(img1)
#制作掩碼
mask=np.zeros(img1.shape[:2],np.uint8)
mask[int( h/4 ) : int (3*h/4) , int(w/4) : int(3*w/4) ] = 255
#計算直方圖
hist_full=cv2.calcHist(
[img1], #影像
[0], #通道
None, #無掩碼
[256], #灰度級
[0,256], #像素的灰度范圍
)
hist_mask=cv2.calcHist(
[img1], #影像
[0], #通道
mask, #有掩碼
[256], #灰度級
[0,256], #像素的灰度范圍
)
plt.subplot(2,2,1)
plt.imshow(img1)
plt.subplot(2,2,2)
plt.imshow(img2)
plt.subplot(2,2,3)
plt.imshow(mask)
plt.subplot(2,2,4)
plt.plot(hist_full)
plt.plot(hist_mask)
plt.show()
#cv2.imshow("1",img1)
#cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 紅色的直方圖是原圖的,藍色的直方圖是直方圖均衡化后的
彩色影像增強
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
#轉換到YUV空間
img_yuv=cv2.cvtColor(img1,cv2.COLOR_BGR2YUV)
#YUV空間的影像直方圖均衡化
#對Y通道的所有像素進行均衡化
img_yuv[:,:,0]=cv2.equalizeHist(img_yuv[:,:,0])
#轉換回來
img2=cv2.cvtColor(img_yuv,cv2.COLOR_YUV2BGR)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 左圖中吼姆上的橫條被增強了
顏色分離
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
hsv=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)
low_blue=np.array([50,100,50])
upper_blue=np.array([130,255,255])
mask=cv2.inRange(hsv,low_blue,upper_blue)
masked_img=cv2.bitwise_and(img1,img1,mask=mask)
#轉換回來
img2=cv2.cvtColor(masked_img,cv2.COLOR_HSV2BGR)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

移除背景
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
#到RGB空間
rgb=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
#準備grabCut的引數------------
#矩形做引數 x,y,w,h
rect=(1,1,w,h) #不能從0,0開始
mask=np.zeros((h,w),np.uint8)
#背景的臨時陣列
back=np.zeros((1,65),np.float64) #只能是(1,65)
#前景的臨時陣列
front=np.zeros((1,65),np.float64) #只能是(1,65)
print(mask)
print("---------------------------------------------------")
cv2.grabCut(
rgb, #RGB影像
mask, #掩碼 —— 被結果放在掩碼里
rect, #矩形
back, #背景
front, #前景
5, #迭代次數
cv2.GC_INIT_WITH_RECT #使用定義的矩形初始化
)
print(mask)
print("---------------------------------------------------")
mask2=np.where(
(mask==2) | (mask == 0), #條件——背景是0,2
0, #滿足條件的設定為0
1 #不滿足條件設定為1
).astype('uint8')
print(mask2.shape) #mask2是二維的
#掩碼2與RGB影像乘,除去背景
img2=rgb * mask2[:,:,np.newaxis]
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
---------------------------------------------------
[[0 0 0 ... 0 0 0]
[0 2 2 ... 2 2 2]
[0 2 2 ... 2 2 2]
...
[0 2 2 ... 2 2 2]
[0 2 2 ... 2 2 2]
[0 2 2 ... 2 2 2]]
---------------------------------------------------
(1012, 518)

- grabCut效果不好啊,,,不能依靠一個函式就解決問題
自適應閾值化
img1=cv2.imread("1.jpg",cv2.IMREAD_GRAYSCALE)
h,w=img1.shape[:2]
img2=cv2.adaptiveThreshold(
img1, #灰度影像
250, #最大灰度值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, #自適應閾值演算法
cv2.THRESH_BINARY, #二值化方法
331, #分成區域大小,必須取奇數
10 #閾值化后減去這個值,就是最終值
)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

邊緣檢測
img1=cv2.imread("1.jpg",cv2.IMREAD_GRAYSCALE)
h,w=img1.shape[:2]
#灰度強度的中位值
median=np.median(img1)
#閾值
lower=int( max( 0, ( 1 - 0.33)* median ) )
upper=int( min( 255, ( 1 + 0.33)* median ) )
#Canny檢測器
img2=cv2.Canny(img1,lower,upper)
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 邊緣檢測的方法有Canny,Sobel,Laplacian,Scharr
角點檢測
Harris角點檢測器
img1=cv2.imread("1.jpg",cv2.IMREAD_COLOR)
h,w=img1.shape[:2]
#限定數值型別
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray=np.float32(gray)
#檢測角點
detected=cv2.cornerHarris(
gray, #灰度圖
2, #領域大小
3, #Sobel算子孔徑大小
0.04 #
)
#歸一化
norm=np.zeros((h,w),np.uint8)
x=cv2.normalize(detected,norm,0,255,cv2.NORM_MINMAX)
img2=img1.copy()
#角點畫上紅圈
for r in range(h):
for c in range(w):
if int(x[r,c]) > 70:
cv2.circle(img2,(c,r),5,(10,10,255))
cv2.imshow("1",img1)
cv2.imshow("2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352053.html
標籤:其他
