質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1183閲覧

画像に線を引きたいのですが…

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/07 07:09

編集2019/01/07 08:08

前提・実現したいこと

画像にランダムに線を引きたい

発生している問題・エラーメッセージ

python初心者です。
下記のエラーの解決法どころかエラーの内容も理解できていません。

File "ex2.py", line 21, in <module> image = AddLine(image) File "ex2.py", line 15, in AddLine newimage = cv2.line(image, (x,0), (x,height), (0,0,0), thickness) TypeError: img is not a numpy array, neither a scalar

該当のソースコード

python

1import cv2 2import math 3import random 4from PIL import Image 5import numpy as np 6 7 8def AddLine(image): 9 width, height = image.size 10 newimage = Image.new('RGB',(width,height)) 11 thickness = 2 12 13 for i in range(200): 14 x = random.randint(i,0) 15 y = random.randint(0,i) 16 newimage = cv2.line(image, (x,0), (x,height), (0,0,0), thickness) 17 newimage = cv2.line(image, (0,y), (width,y), (0,0,0), thickness) 18 return newimage 19 20if __name__ == "__main__": 21 image = Image.open("Figure.png") 22 image = AddLine(image) 23 image.show()

※for i in range(200)内で実現したいこと
画像の縦、横の端から端まで200本ずつ線を引く(間隔はランダムです)

イメージ図
イメージ説明

補足情報

エラーの解決だけでなく上記の※の実現方法においてもご教授いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PILとOpenCVを混ぜていることに問題があるように思えます。
例えばOpenCVに一本化するならば、次のように書けば良いです。

Python

1... 2 3if __name__ == "__main__": 4 image = cv2.imread("Figure.png") 5 assert image is not None 6 7 image = AddLine(image) 8 cv2.imshow('result', image) 9 cv2.waitKey()

また、関数AddImage内で画像を複製する必要も無いように思います。

書いてみた

面白そうだったので。

Python

1import random 2import cv2 3 4 5def rand_edges(height, width): 6 # pt (x, y) 7 pt_up = random.randrange(width), 0 8 pt_down = random.randrange(width), height-1 9 pt_left = 0, random.randrange(height) 10 pt_right = width-1, random.randrange(height) 11 12 return random.sample( 13 [pt_up, pt_down, pt_right, pt_left], k=2 14 ) 15 16 17 18def add_line(img): 19 height, width, depth = img.shape 20 21 edges = rand_edges(height, width) 22 23 print(*edges) 24 cv2.line(img, *edges, (0, 0, 0), thickness=2) 25 26 27def main(): 28 img = cv2.imread('Figure.png') 29 assert img is not None 30 31 for _ in range(10): 32 add_line(img) 33 34 cv2.imshow('result', img) 35 cv2.waitKey() 36 37 38if __name__ == '__main__': 39 main()

実行例
レナ姐さんごめんなさい

質問編集を受けて

鉛直な線及び水平な線を引きたいのですね。
それならば、私の書いたコードの関数rand_edgesを改造するだけです。

Python

1def rand_edges(height, width): 2 pt_x = random.randrange(width) 3 pt_y = random.randrange(height) 4 5 return random.choice( 6 [ 7 [(pt_x, 0), (pt_x, height-1)], 8 [(0, pt_y), (width-1, pt_y)] 9 ] 10 )

投稿2019/01/07 07:16

編集2019/01/07 08:14
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/07 08:19 編集

回答ありがとうございます。 鉛直な線、平行な線を引くことができました!感謝です!
LouiS0616

2019/01/07 08:17

追記しました。
LouiS0616

2019/01/07 08:19

あ、縦に200本、横に200本、計400本描くのですね。 それでしたら、『ランダムに鉛直線を描きこむ関数』と『ランダムに水平線を描きこむ関数』とをそれぞれ用紙して、200回ずつ呼ぶのが楽だと思います。
guest

0

cv.lineで線を描画するなら、画像はcv2.imreadで開いた方がやりやすいと思います。

投稿2019/01/07 07:15

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問