opencv笔记(python)

基础
import cv2
img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
#彩色图像
img1 = cv2.imread("image/05.tif") #图片读取
img1 = cv2.resize(img1,(740,735))
(B,G,R) = cv2.split(img1) #通道拆分
cv2.imshow('a_window', G) #图片显示
cv2.waitKey(0)
模板匹配

cv2.matchTemplate(src, template, method) # 用于进行模板匹配
参数说明: src目标图像, template模板,method使用什么指标做模板的匹配度指标
模板匹配实例

#图像模板匹配
import cv2
import numpy as np
import matplotlib.pyplot as plt

original = cv2.imread('image/01.jpg')
img = cv2.imread('image/01.jpg', 0)
template = cv2.imread('image/0101.jpg', 0)

h, w = template.shape[:2]

methods = ['cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCOEFF', 'cv2.TM_SQDIFF_NORMED', 'cv2.TM_SQDIFF',
           'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED']
ret = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)

draw_img = original.copy()
ret = cv2.rectangle(draw_img, max_loc, (max_loc[0]+w, max_loc[1]+h), (0, 0, 255), 2)
arr_max_loc = np.array(max_loc)
arr_max_loc[0] = arr_max_loc[0] + int(w/2)
arr_max_loc[1] = arr_max_loc[1] + int(h/2)
max_loc = tuple(arr_max_loc)
#cv2.circle(draw_img, max_loc, 1, (24, 255, 0), 4) #模板中间点
cv2.imshow('ret', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像旋转

# -*- coding:gb2312 -*-
import cv2
from math import *
import numpy as np
 
img = cv2.imread("image/05.tif")
 
height,width=img.shape[:2] 
degree=90
#旋转后的尺寸
heightNew=int(width*fabs(sin(radians(degree)))+height*fabs(cos(radians(degree))))
widthNew=int(height*fabs(sin(radians(degree)))+width*fabs(cos(radians(degree))))

matRotation=cv2.getRotationMatrix2D((width/2,height/2),degree,1)
matRotation[0,2] +=(widthNew-width)/2 #重点在这步,目前不懂为什么加这步
matRotation[1,2] +=(heightNew-height)/2 #重点在这步
 
imgRotation=cv2.warpAffine(img,matRotation,(widthNew,heightNew),borderValue=(255,255,255))
print(np.shape(imgRotation)) #90度旋转像素尺寸不变
cv2.imshow("img",img)
cv2.imshow("imgRotation",imgRotation)
cv2.waitKey(0)
一个奇怪的问题
使用opencv对图像某区域像素值遍历比较,并不能正确获取到图像中该区域最大像素值点。
img1 = cv2.imread("blur.png")
print(img[158,282])#(158,282)点处的像素值,在进行比较时,该值无效
#更改方法 --> 使用pillow
from PIL import Image
img=Image.open("blur.png")
img_array=img.load()
print(img_array[158,282],img_array[424,346])#该像素值可以进行有效比较,得到区域或整张图片的最大/最小像素值点
获取图像中区域最大/最小像素值点
#获取图像中区域最大/最小像素值点
import cv2
import numpy as np
from PIL import Image

def draw_point(src, loc1, loc2):
    height = src.shape[0]
    width = src.shape[1]
    output = np.zeros((height, width,3), dtype=np.uint8)
    output[0:src.shape[0], 0:src.shape[1]] = src
    cv2.circle(output, loc1, 2, (0, 255, 0), 4)  # 
    cv2.circle(output, loc2, 2, (0, 0, 255), 2)  # 
    cv2.imshow('show', output)
    cv2.waitKey()
    return output
    
def get_position1(p1):
    roi_set = [] 
    for i in range(p1[0]-50,p1[0]+50):
        for j in range(p1[1]-50,p1[1]+50):
            roi_set.append([(i,j),img_array[i,j]])#原图的像素值
    seq_roi = sorted(roi_set, key=lambda x: float(x[1]), reverse=True)#区域最亮
    return seq_roi[0][0]
    
def get_position2(p1):
    roi_set = [] 
    for i in range(p1[0]-50,p1[0]+50):
        for j in range(p1[1]-50,p1[1]+50):
            roi_set.append([(i,j),img_array[i,j]])#原图的像素值
    seq_roi = sorted(roi_set, key=lambda x: float(x[1]), reverse=False)#区域最暗
    return seq_roi[0][0]
    
img = cv2.imread("left33.tif")
img = img[100:1388, 470:1770]  # [height,width]裁剪
img = cv2.resize(img, (650, 644))
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
gray = cv2.blur(gray,(31,31))
new_img = Image.fromarray(gray)
img_array=new_img.load()
pos1,pos2 = (158,282),(424,346)
pos1 = get_position1(pos1)
pos2 = get_position2(pos2)
print(pos1,pos2)
output = draw_point(img1, pos1, pos2)
import cv2
from skimage.morphology import disk
import skimage.filters.rank as sfr

image = cv2.imread(...)
dst = sfr.entropy(image, disk(5))
    H, W = dst.shape
    for i in range(0, H):
        for j in range(0, W):
            dst[i, j] = int(dst[i,j] *25.5) #转为0-255
dst = np.asarray(dst,dtype=np.uint8)
cv2.imwrite(path, dst)

阈值处理函数
cv2.threshold()
函数:第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指用来对像素值进行分类的阈值。
第三个参数 y 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第四个参数 Methods 指,不同的不同的阈值方法,这些方法包括:
•cv2.THRESH_BINARY 图(1)
•cv2.THRESH_BINARY_INV 图(2)
•cv2.THRESH_TRUNC 图(3)
•cv2.THRESH_TOZERO 图(4)
•cv2.THRESH_TOZERO_INV 图(5)

cv2.adaptiveThreshold()
函数:第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第三个参数 adaptive_method 指: CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
第四个参数 threshold_type 指取阈值类型:必须是下者之一 • CV_THRESH_BINARY,
• CV_THRESH_BINARY_INV
第五个参数 block_size 指用来计算阈值的象素邻域大小: 3, 5, 7, …

第六个参数 param1 指与方法有关的参数。
对方法CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一个从均值或加权均值提取的常数, 尽管它可以是负数。
自适应阈值: 对方法CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。
对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值