Ani*_*dey 14 opencv image python-2.7
from scipy.misc import imread
from matplotlib import pyplot
import cv2
from cv2 import cv
from SRM import SRM ## Module for Statistical Regional Segmentation
im = imread("lena.png")
im2 = cv2.imread("lena.png")
print type(im), type(im2), im.shape, im2.shape
## Prints <type 'numpy.ndarray'> <type 'numpy.ndarray'> (120, 120, 3) (120, 120, 3)
srm = SRM(im, 256)
segmented = srm.run()
srm2 = SRM(im2, 256)
segmented2 = srm2.run()
pic = segmented/256
pic2 = segmented2/256
pyplot.imshow(pic)
pyplot.imsave("onePic.jpg", pic)
pic = pic.astype('uint8')
cv2.imwrite("onePic2.jpg", pic2)
pyplot.show()
Run Code Online (Sandbox Code Playgroud)
onePic.jpg
给出正确的分割图像,但onePic2.jpg
给出完整的黑色图像.将数据类型转换为uint8
使用pic = pic.astype('uint8')
没有帮助.我仍然给出一个黑色的图像!
onePic.jpg使用pyplot.imsave()
:
onePic2.jpg使用cv2.imwrite()
:
请帮忙!
san*_*iso 24
在转换pic
为之前uint8
,您需要将其乘以255以获得正确的范围.
小智 7
尽管我同意@sansuiso,但就我而言,我发现了一种可能的边缘情况,即我的图像在比例上移动了一位或向下移动了一位。
由于我们处理的是无符号整数,因此单个移位意味着可能的下溢/上溢,这可能会损坏整个图像。
我发现cv2的convertScaleAbs的alpha值为255.0可以产生更好的结果。
def write_image(path, img):
# img = img*(2**16-1)
# img = img.astype(np.uint16)
# img = img.astype(np.uint8)
img = cv.convertScaleAbs(img, alpha=(255.0))
cv.imwrite(path, img)
Run Code Online (Sandbox Code Playgroud)
这个答案更详细。
归档时间: |
|
查看次数: |
23645 次 |
最近记录: |