鱼C论坛

 找回密码
 立即注册
查看: 1965|回复: 3

[技术交流] 利用easygui实现一个简易Opencv的小系统

[复制链接]
发表于 2020-10-11 14:30:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

import numpy as np
from matplotlib import pyplot as plt
import torch
import cv2 as cv
import easygui as g
import sys

def winname(name):
    return name.encode('gbk').decode(errors='ignore')
def fake_color_image(image_gray):
    r = 0
    g=0
    b=0
    height = image_gray.shape[0]
    weight = image_gray.shape[1]
    out_color_image = np.zeros((height,weight,3),np.uint8)
    for i in range(height):
        for j in range(weight):
             val = image_gray[i,j]
             if (val <128):
                 r = 0
             elif (val <192):
                 r=255/64*(val-128)
             else:
                 r = 255
             if (val < 64):
                 g = 255 / 64 * val
             elif (val < 192):
                 g = 255
             else:
                 g = -255 / 63 * (val - 192) + 255
             if (val < 64):
                 b = 255
             elif (val < 128):
                 b = -255 / 63 * (val - 192) + 255
             else:
                 b = 0
             out_color_image[i,j,0] = b
             out_color_image[i,j,1] = g
             out_color_image[i,j,2] = r
    cv.imshow("fake color image",out_color_image)
def image_gray1(img_gray):
    img_gray1 = img_gray.copy()
    img_gray1 = (img_gray[:, :, 0] + img_gray[:, :, 1] + img_gray[:, :, 2]) / 3  # 第一种方式为对各个通道求均值
    img_gray1 = img_gray1.astype(np.uint8)  # 猪油数组类型为unit类型时,才会认为是一张图片
    cv.imshow("gray image 1",img_gray1)
    cv.waitKey(1000)
def image_gray2(img_gray):
    img_gray2 = img_gray.copy()
    img_gray2 = img_gray[:, :, 0] * 0.11 + img_gray[:, :, 1] * 0.59 + img_gray[:, :, 2] * 0.3
    img_gray2 = img_gray2.astype(np.uint8)  # GRAY=0.3*R+0.59*G+0.11*B:
    cv.imshow("gray image 2",img_gray2)
    cv.waitKey(10)

plt.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False     # 正常显示负号
a=''
filename = ''
img =  np.ones((3,3),dtype=np.uint8)
msg="请输入您想要完成的任务(建议您第一步先打开图片)"
title='第一次作业'
choice=('打开图片','退出')
a=g.buttonbox(msg=msg,title=title,choices=choice)
if a == '打开图片':
        filename = g.fileopenbox(msg="请打开一个jpg文件")
        img = cv.imread(filename)
        msg1 = "选择您想要实现的功能"
        title1 = '第一次作业'
        choice1 = ('灰度化1', '灰度化2', '伪彩色', '直方图', '显示图片', '退出')
        q=1
        while q:
            b=g.buttonbox(msg=msg1,title=title1,choices=choice1)
            #while b!='退出':
            if b == '灰度化1':
                image_gray1(img)
            elif b == '灰度化2':
                image_gray2(img)
            elif b == '显示图片':
                cv.imshow("original image", img)
                cv.waitKey(1000)
            elif b == '伪彩色':
                img_gray = img[:, :, 0] * 0.11 + img[:, :, 1] * 0.59 + img[:, :, 2] * 0.3
                img_gray = img_gray.astype(np.uint8)              #GRAY=0.3*R+0.59*G+0.11*B:
                fake_color_image(img_gray)  #显示伪彩色图
            elif b == '直方图':
                img_gray = img[:, :, 0] * 0.11 + img[:, :, 1] * 0.59 + img[:, :, 2] * 0.3
                img_gray = img_gray.astype(np.uint8)
                pix = []
                height = img_gray.shape[0]
                weight = img_gray.shape[1]
                for i in range(height):
                    for j in range(weight):
                        pix.append(int(img_gray[i,j]))
                # pix1=[]
                # for i in range(256):
                #      number = pix.count(i)
                #      pix1.append(number)
                pix = np.array(pix)

                # data:必选参数,绘图数据
                # bins:直方图的长条形数目,可选项,默认为10
                # normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
                # facecolor:长条形的颜色
                # edgecolor:长条形边框的颜色
                # alpha:透明度
                plt.hist(pix,bins=256,range=[0,255])     #绘制直方图(第二种方式的)

                plt.xlabel( " gray number " )
                plt.ylabel( " number " )
                plt.title("灰度直方图")
                plt.show()
            else:
                q=0
cv.waitKey(0)

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-11 15:18:04 | 显示全部楼层
放到代码框里咯?那样方便阅读
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 22:08:40 | 显示全部楼层
  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. import torch
  4. import cv2 as cv
  5. import easygui as g
  6. import sys

  7. def winname(name):
  8.     return name.encode('gbk').decode(errors='ignore')
  9. def fake_color_image(image_gray):
  10.     r = 0
  11.     g=0
  12.     b=0
  13.     height = image_gray.shape[0]
  14.     weight = image_gray.shape[1]
  15.     out_color_image = np.zeros((height,weight,3),np.uint8)
  16.     for i in range(height):
  17.         for j in range(weight):
  18.              val = image_gray[i,j]
  19.              if (val <128):
  20.                  r = 0
  21.              elif (val <192):
  22.                  r=255/64*(val-128)
  23.              else:
  24.                  r = 255
  25.              if (val < 64):
  26.                  g = 255 / 64 * val
  27.              elif (val < 192):
  28.                  g = 255
  29.              else:
  30.                  g = -255 / 63 * (val - 192) + 255
  31.              if (val < 64):
  32.                  b = 255
  33.              elif (val < 128):
  34.                  b = -255 / 63 * (val - 192) + 255
  35.              else:
  36.                  b = 0
  37.              out_color_image[i,j,0] = b
  38.              out_color_image[i,j,1] = g
  39.              out_color_image[i,j,2] = r
  40.     cv.imshow("fake color image",out_color_image)
  41. def image_gray1(img_gray):
  42.     img_gray1 = img_gray.copy()
  43.     width = img_gray1.shape[1]
  44.     height = img_gray1.shape[0]
  45.     for i in range(height):
  46.         for j in range(width):
  47.             img_gray1[i,j]= (int(img_gray[i,j, 0]) + int(img_gray[i,j, 1]) + int(img_gray[i,j, 2]))/ 3  #强行int类型,实现了灰度化
  48.     # img_gray1 = (img_gray[:, :, 0] + img_gray[:, :, 1] + img_gray[:, :, 2]) / 3  # 第一种方式为对各个通道求均值
  49.     img_gray1 = img_gray1.astype(np.uint8)  # 猪油数组类型为unit类型时,才会认为是一张图片
  50.     cv.imshow("gray image 1",img_gray1)
  51.     cv.waitKey(1000)
  52. def image_gray2(img_gray):
  53.     img_gray2 = img_gray.copy()
  54.     img_gray2 = img_gray[:, :, 0] * 0.11 + img_gray[:, :, 1] * 0.59 + img_gray[:, :, 2] * 0.3
  55.     img_gray2 = img_gray2.astype(np.uint8)  # GRAY=0.3*R+0.59*G+0.11*B:
  56.     cv.imshow("gray image 2",img_gray2)
  57.     cv.waitKey(10)

  58. plt.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
  59. plt.rcParams['axes.unicode_minus']=False     # 正常显示负号
  60. a=''
  61. filename = ''
  62. img =  np.ones((3,3),dtype=np.uint8)
  63. msg="请输入您想要完成的任务(建议您第一步先打开图片)"
  64. title='第一次作业'
  65. choice=('打开图片','退出')
  66. a=g.buttonbox(msg=msg,title=title,choices=choice)
  67. if a == '打开图片':
  68.         filename = g.fileopenbox(msg="请打开一个jpg文件")
  69.         img = cv.imread(filename)
  70.         msg1 = "选择您想要实现的功能"
  71.         title1 = '第一次作业'
  72.         choice1 = ('灰度化1', '灰度化2', '伪彩色', '直方图', '显示图片', '退出')
  73.         q=1
  74.         while q:
  75.             b=g.buttonbox(msg=msg1,title=title1,choices=choice1)
  76.             #while b!='退出':
  77.             if b == '灰度化1':
  78.                 image_gray1(img)
  79.             elif b == '灰度化2':
  80.                 image_gray2(img)
  81.             elif b == '显示图片':
  82.                 cv.imshow("original image", img)
  83.                 cv.waitKey(1000)
  84.             elif b == '伪彩色':
  85.                 img_gray = img[:, :, 0] * 0.11 + img[:, :, 1] * 0.59 + img[:, :, 2] * 0.3
  86.                 img_gray = img_gray.astype(np.uint8)              #GRAY=0.3*R+0.59*G+0.11*B:
  87.                 fake_color_image(img_gray)  #显示伪彩色图
  88.             elif b == '直方图':
  89.                 img_gray = img[:, :, 0] * 0.11 + img[:, :, 1] * 0.59 + img[:, :, 2] * 0.3
  90.                 img_gray = img_gray.astype(np.uint8)
  91.                 pix = []
  92.                 height = img_gray.shape[0]
  93.                 weight = img_gray.shape[1]
  94.                 for i in range(height):
  95.                     for j in range(weight):
  96.                         pix.append(int(img_gray[i,j]))
  97.                 pix1=[]
  98.                 for i in range(256):
  99.                      number = pix.count(i)
  100.                      pix1.append(number)
  101.                 # pix = np.array(pix)
  102.                 pix1 = np.array(pix1)

  103.                 # data:必选参数,绘图数据
  104.                 # bins:直方图的长条形数目,可选项,默认为10
  105.                 # normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
  106.                 # facecolor:长条形的颜色
  107.                 # edgecolor:长条形边框的颜色
  108.                 # alpha:透明度
  109.                 # plt.hist(pix,bins=256,range=[0,255])     #绘制直方图(第二种方式的)
  110.                 plt.plot(pix1)              #利用plot直接根据每个像素点的个数直接绘制直方图
  111.                 plt.xlabel( " gray number " )
  112.                 plt.ylabel( " number " )
  113.                 plt.title("灰度直方图")
  114.                 plt.show()
  115.             else:
  116.                 q=0
  117. cv.waitKey(0)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-13 22:09:20 | 显示全部楼层
是在抱歉,第一次投稿,有很多不清楚的地方还请见谅
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 07:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表