图像旋转角度计算并旋转

这篇具有很好参考价值的文章主要介绍了图像旋转角度计算并旋转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time

def Rotate(img, angle=0.0,fill=0):
    """
    旋转
    :param img:待旋转图像
    :param angle: 旋转角度
    :param fill:填充方式,默认0黑色填充
    :return: img: 旋转后的图像
    """
    w, h = img.shape[:2]
    center = (int(w / 2), int(h / 2))
    rot = cv2.getRotationMatrix2D(center, angle, 1.0)
    img = cv2.warpAffine(img, rot, (h, w), borderValue=fill)
    return img

def CalcAngle(img):
    h, w = img.shape[:2]
    x1, y1, x2, y2 = 0, 0, 0, 0
    angle = 0
    for i in range(h - 1):
        if img[i][int(w / 3)] == 0 and img[i - 1][int(w / 3)] != 0:
            # print("1",int(w/3),i)
            x1, y1 = int(w / 3), i
        if img[i][int(w * 2 / 3)] == 0 and img[i - 1][int(w * 2 / 3)] != 0:
            # print("2",int(w*2/3),i)
            x2, y2 = int(w * 2 / 3), i
        if x1 != 0 and y1 != 0 and x2 != 0 and y2 != 0:
            if x2 - x1 == 0 or y2 - y1 == 0:
                print(u"不需要旋转")
                return 0
            else:
                length = (y2 - y1) / (x2 - x1)
                angle = np.arctan(length) / 0.017453
                if angle < -45:
                    angle = angle + 90
                elif angle > 45:
                    angle = angle - 90
                else:
                    pass
                print(u"旋转角度:", angle)
                return angle
starts = time.clock()

img1=cv2.imread("box.jpg",0)
# img=Rotate(img1,2,255)
ret,img=cv2.threshold(img1,200,255,cv2.THRESH_BINARY)
# cv2.imshow("0",img)
img = cv2.Canny(img, 10, 255, apertureSize=3)
angle=CalcAngle(img)
img=Rotate(img1,angle)
ends = time.clock()
print("time", ends - starts, "秒")
cv2.imwrite("00.jpg",img)
# cv2.imshow("00",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用两张测试图片如下:

图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正 图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正

对于lena的图像测试结果如下:

图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正

 图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正

另一张测试图片结果如下:

图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正

图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正 

 也可以使用下面代码进行测试:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import cv2
import time
import numpy as np

def Location(img, tmp, threshold_value=120, dilate=3, resize_multiple=16):
    """
    图像定位
    :param img: 输入原图
    :param tmp: 定位匹配模板
    :param threshold_value: 图像阈值
    :param dilate: 膨胀值
    :param resize_multiple:缩小倍率
    :return: rect:矩形坐标点,从右上xy到右下xy,四个值
    """
    h, w = img.shape[:2]
    hy, wx = tmp.shape[:2]
    img = cv2.resize(img, (int(w * 1 / resize_multiple), int(h * 1 / resize_multiple)), interpolation=cv2.INTER_AREA)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    img = cv2.erode(img, kernel, iterations=dilate)
    w, h = img.shape[:2]
    for i in range(w):
        for j in range(h):
            if img[i][j] >= threshold_value:
                img[i][j] = 255
            else:
                img[i][j] = 0
    res = cv2.matchTemplate(img, tmp, cv2.TM_SQDIFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    top_left = min_loc
    # bottom_right = ((top_left[0] + wx) * resize_multiple, (top_left[1] + hy) * resize_multiple)
    # top_left = (top_left[0] * resize_multiple, top_left[1] * resize_multiple)
    rect = [top_left[0] * resize_multiple, top_left[1] * resize_multiple, (top_left[0] + wx) * resize_multiple,
            (top_left[1] + hy) * resize_multiple]
    return rect


def RotateAngle(img, threshold_value=120, dilate=3,linenum=6):
    """
    计算图像旋转角度
    :param img: 输入图像
    :param threshold_value: 阈值分割
    :param dilate: 膨胀值
    :return: angle: 旋转角度
    """
    ret,img=cv2.threshold(img,threshold_value,255,cv2.THRESH_BINARY)
    img_w, img_h = img.shape[:2]
    # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 2))
    # img = cv2.erode(img, kernel, iterations=dilate)
    line_widthsize = int(img_w)
    line_lensize = int(img_h / linenum)
    edges = cv2.Canny(img, 10, 255, apertureSize=3)
    try:
        lines = cv2.HoughLinesP(edges, 1, np.pi / 180, line_lensize, minLineLength=int(line_widthsize / 2),
                                maxLineGap=line_widthsize)
        for line in lines[0]:
            # print("角度测量的直线坐标", line)
            x1, y1, x2, y2 = line
            if x2 - x1 == 0 or y2 - y1 == 0:
                print(u"不需要旋转")
                return 0
            else:
                length = (y2 - y1) / (x2 - x1)
                angle = np.arctan(length) / 0.017453
                if angle < -45:
                    angle = angle + 90
                elif angle > 45:
                    angle = angle - 90
                else:
                    pass
                print(u"旋转角度:", angle)
                return angle
    except:
        return 0

def Rotate(img, angle=0.0):
    """
    旋转
    :param img:待旋转图像
    :param angle: 旋转角度
    :return: img: 旋转后的图像
    """
    w, h = img.shape[:2]
    center = (int(w / 2), int(h / 2))
    rot = cv2.getRotationMatrix2D(center, angle, 1.0)
    img = cv2.warpAffine(img, rot, (h, w), borderValue=255)
    return img


def GetObject_Location(img, tmp, threshold_value=120, dilate=3, resize_multiple=16):
    """
    旋转
    :param img:图像
    :param tmp: 模板
    :param threshold_value:阈值
    :param dilate: 膨胀值
    :param resize_multiple:缩放倍数
    :return:
    """
    rect = Location(img, tmp, threshold_value, dilate, resize_multiple)
    imgout = img[rect[1]:rect[3], rect[0]:rect[2]]
    angle = RotateAngle(imgout, threshold_value, dilate, resize_multiple, linenum=6)
    img = Rotate(imgout, angle)
    return img


def SaveTemple(img, file_name=".\\data\\Temple1.jpg", threshold_value=200, dilate=3, resize_multiple=16):
    """
    模板生成存储
    :param img: 输入图像
    :param file_name: 模板保存地址
    :param threshold_value: 阈值分割
    :param dilate: 膨胀值
    :return: img: 保存模板图片到本地
    """
    h, w = img.shape[:2]
    img = cv2.resize(img, (int(w * 1 / resize_multiple), int(h * 1 / resize_multiple)), interpolation=cv2.INTER_AREA)
    img_w, img_h = img.shape[:2]
    print(img_w, img_h)
    # 创建标准模板
    imgout = np.zeros((img_w + 4, img_h + 4, 1), np.uint8)
    # 图像初始化白色
    for i in range(img_w + 4):
        for j in range(img_h + 4):
            imgout[i][j] = 255
    # 图像二值化
    for i in range(img_w):
        for j in range(img_h):
            if img[i][j] >= threshold_value:
                img[i][j] = 255
            else:
                img[i][j] = 0
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    img = cv2.erode(img, kernel, iterations=dilate)
    for i in range(img_w):
        for j in range(img_h):
            if img[i][j] >= threshold_value:
                pass
            else:
                imgout[i + 2][j + 2] = 0
    cv2.imwrite(file_name, imgout)


"""一次切割,根据投影切割"""


def FirstCutting(img, Cvalue, Cerode, LineNum, LineNum1):
    (_, thresh) = cv2.threshold(img, Cvalue, 255, cv2.THRESH_BINARY)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    outimg = cv2.erode(thresh, kernel, iterations=Cerode)
    height, width = outimg.shape[:2]
    z = [0] * height
    v = [0] * width
    hfg = [[0 for col in range(2)] for row in range(height)]
    lfg = [[0 for col1 in range(2)] for row1 in range(width)]
    Box = []
    linea = 0
    BlackNumber = 0
    for y in range(height):
        for x in range(width):
            cp = outimg[y][x]
            if cp == 0:
                linea = linea + 1
                BlackNumber += 1
            else:
                continue
        z[y] = linea
        linea = 0

    inline, start, lineNumber = 1, 0, 0
    for i in range(0, height):
        if inline == 1 and z[i] >= LineNum:
            start = i
            inline = 0
        elif (i - start > 3) and z[i] < LineNum and inline == 0:
            inline = 1
            hfg[lineNumber][0] = start - 2  # 保存行的分割位置起始位置
            hfg[lineNumber][1] = i + 2  # 保存行的分割终点位置
            lineNumber = lineNumber + 1

    lineb = 0
    for p in range(0, lineNumber):
        for x in range(0, width):
            for y in range(hfg[p][0], hfg[p][1]):
                cp1 = outimg[y][x]
                if cp1 == 0:
                    lineb = lineb + 1
                else:
                    continue
            v[x] = lineb
            lineb = 0
        incol, start1, lineNumber1 = 1, 0, 0
        z1 = hfg[p][0]
        z2 = hfg[p][1]
        for i1 in range(0, width):
            if incol == 1 and v[i1] >= LineNum1:
                start1 = i1
                incol = 0
            elif (i1 - start1 > 3) and v[i1] < LineNum1 and incol == 0:
                incol = 1
                lfg[lineNumber1][0] = start1 - 3
                lfg[lineNumber1][1] = i1 + 3
                l1 = start1 - 3
                l2 = i1 + 3
                tmp = [l1, z1, l2, z2]
                Box.append(tmp)
                lineNumber1 = lineNumber1 + 1
                # outimg=cv2.rectangle(outimg,(l1,z1),(l2,z2),(0,255,0),1)
    return Box, BlackNumber, outimg


def Threshold(img, threshold, KernelValue=3, KernelValue1=(1, 1)):
    """
    根据阈值框选
    :param img:输入待处理的图像
    :param threshold:阈值
    :param KernelValue:卷积核
    :return:outimg:输出处理后的图像
    """
    w, h = img.shape[:2]
    for i in range(w):
        for j in range(h):
            """通过设置阈值,来控制喷码花的程度"""
            if img[i][j] >= threshold:
                img[i][j] = 255
            else:
                img[i][j] = 0
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, KernelValue1)
    outimg = cv2.erode(img, kernel, iterations=KernelValue)
    outimg = cv2.dilate(outimg, kernel, iterations=KernelValue)
    return outimg


"""根据投影计算出来的坐标进行数组切割"""

starts = time.clock()
img = cv2.imread("lena.jpg", 0)
# img=Rotate(img,2)
angle=RotateAngle(img,200)
print(angle)
img=Rotate(img,angle)
cv2.imwrite("00.jpg",img)
ends = time.clock()
print("time", ends - starts, "秒")

# img=cv2.imread("formal.bmp",0)
# SaveTemple(img)

lena结果如下:

图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正

美女图片测试结果:

图像旋转角度计算并旋转,opencv-python,opencv,python,图像旋转,图像校正

说明:以上代码仅仅是讲解介绍了图像旋转的计算及矫正原理,实际上准确度受不同图像的影响较大,不过里面使用的相关图像变换的函数值得借鉴参考学习。

 文章来源地址https://www.toymoban.com/news/detail-824240.html

到了这里,关于图像旋转角度计算并旋转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 倾斜矫正:用Python和OpenCV实现图像倾斜校正

    图像倾斜是在图像获取或扫描过程中常见的问题,它可能会导致图像失真、文字难以识别或其他应用中的问题。在本文中,我们将使用Python编程语言和OpenCV库来实现图像倾斜校正。 首先,我们需要安装OpenCV库。可以使用以下命令在Python环境中安装它: 安装完成后,我们可以

    2024年02月03日
    浏览(64)
  • 在 Python 中使用 OpenCV 通过透视校正转换图像

    在计算机视觉和图像处理领域,透视变换是一个强大的工具。它允许我们改变图像的视角以获得新的视点,通常用于校正扭曲或模拟不同的相机角度。本文将探讨一个 Python 脚本,该脚本使用计算机视觉领域流行的 OpenCV 库对图像执行透视变换。我们将详细介绍该脚本的工作原

    2024年01月25日
    浏览(34)
  • 图像合成——OpenCV-Python图像融合详解

    图像合成——OpenCV-Python图像融合详解 在图像处理中,图像的合成是一项重要的任务。OpenCV提供了许多方法来实现图像合成。其中,cv::addWeighted()函数是一种常用的图像融合方法。它可以将两张图片以一定的权重相加,产生一张新的融合图像。 下面我们将详细讲解OpenCV中的c

    2024年02月14日
    浏览(38)
  • OpenCv-Python图像特征识别

    本练习学习了OpenCv-Python关于图像特征识别的一些算法,算法理解起来较为困难,但函数用起来上手比较快,主要要明白函数的输入输出的含义。 虽然算法理解不容易,但程序还算有趣,输入是一个完整的图片和一组图片碎片,如下图,然后经过算法计算,把碎片匹配到正确

    2024年02月07日
    浏览(29)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果 一、简单介绍 二、简单图像倾斜校正处理效果实现原理 三、简单图像倾斜校正处理效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言。是一种面向对

    2024年04月13日
    浏览(41)
  • OpenCV-Python(49):图像去噪

    学习使用非局部平均值去噪算法去除图像中的噪音 学习函数cv2.fastNlMeansDenoising()、cv2.fastNlMeansDenoisingColored等         在前面的章节中我们已经学习了很多图像平滑技术,比如高斯平滑、中值平滑等。当噪声比较小时,这些技术的效果都是很好的。在这些技术中我们选取像

    2024年01月21日
    浏览(29)
  • OpenCV-Python中的图像基础操作

    首先读入一副图像: 获取像素值及修改的更好方法: img = cv2.imread(‘./resource/image/1.jpg’, cv2.IMREAD_COLOR) img.shape: 图像的形状(包括行数,列数,通道数的元组) img.size : 图像的像素数目 img.dtype :图像的数据类型 ROI(regionofinterest),感兴趣区域。机器视觉、图像处理中,从被

    2024年02月11日
    浏览(28)
  • OpenCV-Python中的图像处理-图像直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月12日
    浏览(31)
  • opencv-python 将图像迷宫转为迷宫数组

    起因是我想做个自动走迷宫的外挂(其实是想做点实践),所以我需要在游戏中捕捉画面并自动寻路,然后再控制自动移动,此为第一部分:捕捉画面。 1.取得图像迷宫 2.处理图像 3.图像分割 4.生成数组 首先我们得捕捉屏幕画面,即获得迷宫图像,这里我是在steam上面找了一

    2024年02月07日
    浏览(29)
  • OpenCV-Python中的图像处理-霍夫变换

    霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使用。 Hough直线变换,可以检测一张图像中的直线 cv2.HoughLines(image, rho, theta, threshold) return:返回值

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包