Python+CV2实现黑色背景的旋转图片矫正回水平图片

news/2024/11/24 3:25:22/

目  录

一、思路

二、代码

三、效果


参考 https://blog.csdn.net/weixin_42259833/article/details/124398342

一、思路

因为黑色背景且旋转图片为矩形,找最长直线,计算直线角度,图片旋转,去掉多余黑色区域。

二、代码

import cv2
import numpy as np
import mathdef get_long_line(img):C = cv2.Canny(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), 10, 200, apertureSize=3)  # 边缘检测 #10lines = cv2.HoughLines(C, 1, np.pi / 180, 20)  # 直线检测# 滤波img = cv2.blur(img, (3, 3))  # 5,5img = cv2.medianBlur(img, 5)for line in lines:rho = line[0][0]  # 第一个元素是距离rhotheta = line[0][1]  # 第二个元素是角度thetaif (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)):  # 垂直直线pt1 = (int(rho / np.cos(theta)) + 490, 0 + 372)  # 该直线与第一行的交点# 该直线与最后一行的焦点pt2 = (int((rho - img.shape[0] * np.sin(theta)) / np.cos(theta)) + 490, img.shape[0] + 372)else:  # 水平直线pt1 = (0, int(rho / np.sin(theta)))  # 该直线与第一列的交点# 该直线与最后一列的交点pt2 = (img.shape[1], int((rho - img.shape[1] * np.cos(theta)) / np.sin(theta)))return (pt1, pt2)pass# 读取照片
L = cv2.imread('3.png')  # queryImage
# 高斯滤波
L = cv2.GaussianBlur(L, (3, 3), 1)
#获取最长直线
pt1, pt2 = get_long_line(L)
angle = 90-math.degrees(math.atan2(pt2[0]-pt1[0], pt2[1]-pt1[1]))
#图片旋转
rows,cols=L.shape[:2]
rotation_matrix=cv2.getRotationMatrix2D((cols//2,rows//2),angle,1)
image_rotation_0=cv2.warpAffine(L,rotation_matrix,(cols,rows))
# 得到新的位置
rows, cols = np.where(image_rotation_0[:, :, 0] != 0)
min_row, max_row = min(rows)+1, max(rows)-1
min_col, max_col = min(cols)+1, max(cols)-1
# 去除黑色无用部分
image_rotation_0 = image_rotation_0[min_row:max_row, min_col:max_col, :]#图片显示
cv2.line(L, pt1, pt2,(0,0,255) , 2)  # 绘制一条蓝线
cv2.imshow('a',L)
cv2.imshow('B',image_rotation_0)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、效果

*原图的最长直线

*校正后效果 

 


http://www.ppmy.cn/news/323254.html

相关文章

解决 Android Bitmap 合成图片时 PNG透明背景 为黑色的问题

// 取得Resource 图片的BitmapBitmap vBitmap BitmapFactory.decodeResource( this.getResources(), R.drawable.icon);// 建立Paint 物件Paint vPaint new Paint();vPaint .setStyle( Paint.Style.STROKE ); //空心vPaint .setAlpha( 75 ); // //canvas.drawBitmap ( vB…

android Image设置图片资源显示黑色。

项目中添加了各国国旗的资源&#xff0c;然后根据国家名称&#xff0c;找到不同的国旗图标。Android studio debug 模式下没有问题的&#xff0c;但是项目发布release版本后&#xff0c;有的国家的国旗显示为黑色的框。 如图&#xff1a; 根据name 找图片资源的方法&#xff…

小程序电子签名,解决安卓保存图片是黑色背景的问题

在公司最近做的项目中&#xff0c;需要用户在小程序里保存签名为jpg格式图片并打印签名&#xff0c;但是&#xff0c;我用canvas绘制签名后&#xff0c;ios保存图片背景是白色&#xff0c;安卓则是黑色&#xff1b; 这是因为ios会将jpg格式图片的透明背景填充成白色&#xff0…

Three.js 解决纹理渲染后模型为黑色

文章目录 前言一、图片路径错误二、TextureLoader()是异步操作, 但是没有回调渲染三、渲染时机不正确四、渲染函数里没有requestAnimationFrame()五、尝试使用require引入纹理六、浏览器不能读取本地文件七、光照附-颜色color加载不出总结 前言 有很多种情况, 我一一列举一下,…

python黑色变白色_在OpenCV python中将白色像素转换为黑色

我知道这已经得到了答复。我有一个编码的python解决方案。 首先我发现this thread解释了如何删除白色像素。 结果是: 另一个测试img: 编辑 这是一种更好、更短的方法。在@ZdaR评论了在图像矩阵上循环之后,我对此进行了研究。 [更新了代码]img = cv2.imread("Images/tes…

Three TextureLoader纹理贴图不显示图片(显示黑色)

本人初学three.js&#xff0c;根据Three中文文档学习&#xff0c;在学习过程中发现TextureLoader纹理贴图不显示图片&#xff08;显示黑色&#xff09;&#xff0c;在文档中的代码如下所示&#xff1a; // 纹理贴图映射到一个矩形平面上 var geometry new THREE.PlaneGeometr…

python黑色变白色_使用Python openCV PIL将黑色更改为白色,但不将白色更改为黑色...

我试图用python中的opencv使用cv2或PIL将黑色像素改为白色。在 原图&#xff1a; 这是我的代码&#xff1a;import cv2 import numpy as np frame cv2.imread("numptest/captcha.png") cv2.imshow(frame,frame) lower_black np.array([0,0,0]) upper_black np.arr…

微信分享圆角图片有黑色部分

近期做微信分享&#xff0c;分享时图片需要用app的logo做为分享图标&#xff0c;因为logo是一个圆角的图标&#xff0c;并且背景为透明色&#xff0c;所以导致分享后图片有黑色的部分 1.第一种解决方案就是直接让ui重新切图 2.直接用代码实现&#xff0c;给图片加白色的背景 …