前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[python3 OpenCV3填坑之旅]解决图像数学运算后无法正确显示的问题

[python3 OpenCV3填坑之旅]解决图像数学运算后无法正确显示的问题

作者头像
小宋是呢
发布2019-06-27 11:42:57
1.2K0
发布2019-06-27 11:42:57
举报
文章被收录于专栏:深度应用深度应用

最近用的OpenCV python3 开发场景识别的应用,遇到了在图像进行数学逻辑运算后无法真确显示的问题,问题代码如下:

代码语言:javascript
复制
out = 1*((img[:,:,2]>img[:,:,1])&(img[:,:,1]>img[:,:,0]))
print(out.shape,np.sum(out))
while (True):
    cv2.imshow("myWin", (out*255))
    if(cv2.waitKey(1000//12) &  0xff == ord("q")):
        #cv2.imwrite("test/chess_deal.png", out*255)
        break
cv2.destroyAllWindows()

显示输出out输出图片的形状与数据都没有问题,可就是无法正确显示。 最后通过一个语句发现到了问题所在:

代码语言:javascript
复制
print(out.dtype)

输出结果为:

代码语言:javascript
复制
int64

发现原因所在,由于OpenCV处理数据需要uint8类型,图像进行数学逻辑运算时,被转换成了int64,如果想OpenCV正确显示,需要进行数据类型转换:

代码语言:javascript
复制
out_deal = out.astype(np.uint8)

完整代码如下(OpenCV做的火焰动态检测装置):

代码语言:javascript
复制
import cv2
import numpy as np
"""人眼的视网膜上有两类感光器:锥状体和杆状体。锥状体主要位于视网膜的中间部分,称之为中央凹,且对颜色高度敏感,称为白昼视觉或亮视觉;
杆状体分布面积较大,用来给出视野内的一般的总体图像,没有彩色感觉,而对低照明度敏感,称为微光视觉或暗视觉。由于锥状体对红、绿、蓝三种
颜色的光很敏感,因此一般用于人眼观看的颜色模型是RGB模型。一般来说,无论是在网上下载的图片或视频,还是从摄像机得来的录像,都是RGB
模型。所以,我们从网上下载了一幅火焰图像,不用进行任何的颜色模型转换就可以使用RGB颜色判据来提取区域。

    对于普通的火焰来说,它的红色分量和绿色分量会很大,并且绿色分量会大于蓝色分量,所以我们设下的简单判据是:
                    R > R_avg    AND
                    G > G_avg    AND
                    R > G > B
    其中,R_avg为红色分量的均值。
    在OpenCV1.0中实现很简单,下面先摆出代码
--------------------- 
作者:电磁炮X 
来源:CSDN 
原文:https://blog.csdn.net/qq_27569955/article/details/51502824 
版权声明:本文为博主原创文章,转载请附上博文链接!
"""
print(cv2.__version__)


img = cv2.imread("test/flame1.jpg")

line, cols, chl = img.shape
img_avg = []
for i in range(chl):
    img_avg.append(np.average(img[:,:,i]))
overAvg = []
for i in range(chl):
    overAvg.append(img[:,:,i]>img_avg[i])

#out = (overAvg[1] and overAvg[0]) and ((img[:,:,2]>img[:,:,1]) and (img[:,:,1]>img[:,:,0]))
out = 1*((overAvg[2]&overAvg[1])&((img[:,:,2]>img[:,:,1])&(img[:,:,1]>img[:,:,0])))

out = out
print(np.sum(out)/(line * cols)*100,out.shape)
print(out.dtype)
print((out*255).astype(np.uint8).dtype)
while (True):
    cv2.imshow("myWin", (out*255).astype(np.uint8))
    if(cv2.waitKey(1000//12) &  0xff == ord("q")):
        #cv2.imwrite("test/chess_deal.png", (out*255).astype(np.uint8))
        break

cv2.destroyAllWindows()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档