前言

对比度,边沿检测等等


直方图

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


在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐